Показать сообщение отдельно
  #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;
Ответить с цитированием