Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.10.2014, 19:55
BProg BProg вне форума
Прохожий
 
Регистрация: 06.02.2014
Сообщения: 12
Версия Delphi: XE3
Репутация: 10
По умолчанию BitBlt для поворота битмапа

Доброго времени суток!
Подскажите, пожалуйста, с такой темой. Мне нужно повернуть битмап на 90 градусов. Ниже код, работает на размерах картинки 1275*1740 и несколько больше, а вот на 2550*3480 уже нет, на выходе пустой лист. Неважно цветная ли, ч/б или с оттенками серого. Белый лист, а для ч/б - черный и все. Хотел в аттач два скана разных размеров кинуть, но тяжелые даже в архиве.
Помогите, понять что делаю не верно.
Спасибо.

Код:
procedure TForm2.Button1Click(Sender: TObject);
var
  tmpBMP, BMP: TBitmap;
  XForm: TXForm;
  C, S: Single;
  angle: Extended;
  errorCode: Integer;
  error: string;
  i:Integer;
begin
for i := 1 to 2 do
 begin
  angle:=0.5*pi;
  if Sender=Button1 then
    angle:=-angle;

  BMP:=TBitmap.Create;
  BMP.LoadFromFile('D:\Scan'+IntToStr(i)+'.bmp');

  C := Cos(angle);
  S := Sin(angle);
  XForm.eM11 := C;
  XForm.eM12 := S;
  XForm.eM21 := -S;
  XForm.eM22 := C;
  XForm.eDx :=(Bmp.Height - Bmp.Width * C + Bmp.Height * S) / 2;
  XForm.eDy :=(Bmp.Width - Bmp.Width * S - Bmp.Height * C) / 2;

  tmpBMP:=TBitmap.Create;
  tmpBMP.Width:=BMP.Height;
  tmpBMP.Height:=BMP.Width;

  SetStretchBltMode(tmpBMP.Canvas.Handle, STRETCH_HALFTONE);
  SetGraphicsMode(tmpBMP.Canvas.Handle, GM_ADVANCED);
  SetWorldTransform(tmpBMP.Canvas.Handle, XForm);
  if BitBlt(tmpBMP.Canvas.Handle, 0, 0, tmpBMP.Height, tmpBMP.Width, BMP.Canvas.Handle,
      0, 0, SRCCOPY) then
   begin
     tmpBMP.SaveToFile('D:\ScanRotated'+IntToStr(i)+'.bmp');
   end
     else
       begin
         errorCode:=GetLastError;
         error:='Не удалось выполнить поворот страницы';
         if errorCode<>0 then
           error:=error+': '+SysErrorMessage(errorCode);
         MessageBox(Self.Handle, PChar(error),'Ошибка',MB_OK or MB_ICONWARNING);
       end;
 tmpBMP.Free;
 BMP.Free;
 end;
end;

Последний раз редактировалось BProg, 09.10.2014 в 20:02.
Ответить с цитированием
  #2  
Старый 10.10.2014, 04:21
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А что если так попробовать?
Ответить с цитированием
  #3  
Старый 10.10.2014, 10:24
BProg BProg вне форума
Прохожий
 
Регистрация: 06.02.2014
Сообщения: 12
Версия Delphi: XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
А что если так попробовать?
Поворачивает, но адово размер файла увеличивает, в 4 раза. Глубина цвета не учитывается, было 8, стало 32. И все-таки хочется понять почему мой поворачивает маленькие файлы, а большие - нет. Пороюсь в исходнике этом, спасибо.

Последний раз редактировалось BProg, 10.10.2014 в 10:51.
Ответить с цитированием
  #4  
Старый 10.10.2014, 11:10
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от BProg
Поворачивает, но адово размер файла увеличивает, в 4 раза...


Похоже нужно перед сохранением уже повёрнутого изображения ещё и задать формат глубины, примерно так
Код:
RotatedBitmap.PixelFormat:= pf24bit { или pf8bit};
т.к. он по-умолчанию 32х битный
Ответить с цитированием
  #5  
Старый 10.10.2014, 22:52
BProg BProg вне форума
Прохожий
 
Регистрация: 06.02.2014
Сообщения: 12
Версия Delphi: XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Похоже нужно перед сохранением уже повёрнутого изображения ещё и задать формат глубины, примерно так
Код:
RotatedBitmap.PixelFormat:= pf24bit { или pf8bit};
т.к. он по-умолчанию 32х битный
Ну в общем работает, взял нужную часть себе, спасибо Вам и заморскому автору
Интересно бы конечно понять что так ломает функцию апи
Ответить с цитированием
  #6  
Старый 14.10.2014, 09:51
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Зачем вы считаете синус и косинус 90 градусов? Ведь это 1 и 0.
Ответить с цитированием
  #7  
Старый 14.10.2014, 14:56
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

И все-таки хочется понять почему мой поворачивает маленькие файлы, а большие - нет.

Еслине задать PixelFormat, то битмап создаётся в совместимом формате, и не может быть намного больше экрана.
То есть сразу после TBitmap.Create задайте PixelFormat, а только потом - размеры.
Ответить с цитированием
  #8  
Старый 20.10.2014, 11:20
BProg BProg вне форума
Прохожий
 
Регистрация: 06.02.2014
Сообщения: 12
Версия Delphi: XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Еслине задать PixelFormat, то битмап создаётся в совместимом формате, и не может быть намного больше экрана.
То есть сразу после TBitmap.Create задайте PixelFormat, а только потом - размеры.
Не понял. Что значит намного больше, на сколько?
Но проблема осталась, присвоил приемнику PixelFormat источника.
Спасибо
Ответить с цитированием
  #9  
Старый 21.10.2014, 12:19
BProg BProg вне форума
Прохожий
 
Регистрация: 06.02.2014
Сообщения: 12
Версия Delphi: XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Похоже нужно перед сохранением уже повёрнутого изображения ещё и задать формат глубины, примерно так
Код:
RotatedBitmap.PixelFormat:= pf24bit { или pf8bit};
т.к. он по-умолчанию 32х битный
Здесь тоже оказалось не все гладко. При формате pf1bit часто не корректно обрабатывает, то черный весь, то белый. Не мог понять откуда это растет и решил написать перекодирование с 32-х бит на 1. Теперь работает, по крайней мере с нужными мне форматами (24, 8, 1). Всем спасибо за помощь
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:04.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter