|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
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
|
||||
|
||||
А что если так попробовать?
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
|||
|
|||
Цитата:
Последний раз редактировалось BProg, 10.10.2014 в 10:51. |
#4
|
||||
|
||||
Цитата:
Похоже нужно перед сохранением уже повёрнутого изображения ещё и задать формат глубины, примерно так Код:
RotatedBitmap.PixelFormat:= pf24bit { или pf8bit}; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#5
|
|||
|
|||
Цитата:
Интересно бы конечно понять что так ломает функцию апи |
#6
|
|||
|
|||
Зачем вы считаете синус и косинус 90 градусов? Ведь это 1 и 0.
|
#7
|
|||
|
|||
И все-таки хочется понять почему мой поворачивает маленькие файлы, а большие - нет.
Еслине задать PixelFormat, то битмап создаётся в совместимом формате, и не может быть намного больше экрана. То есть сразу после TBitmap.Create задайте PixelFormat, а только потом - размеры. |
#8
|
|||
|
|||
Цитата:
Но проблема осталась, присвоил приемнику PixelFormat источника. Спасибо |
#9
|
|||
|
|||
Цитата:
|