![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток!
Подскажите, пожалуйста, с такой темой. Мне нужно повернуть битмап на 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. |
|
#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
|
|||
|
|||
|
Цитата:
|