Форум по 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.
Ответить с цитированием
 


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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