Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 05.06.2021, 13:09   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 622
По умолчанию Поворот на 90/180 (помогите оптимизировать)

На просторах интернета не нашел нигде как повернуть изображение на 90 / 180 градусов. Но нашел поворот на любой угол. Немного подогнав процедуру с примера под свои задачи получился такой вот код.

Код:
procedure RotateBitmap_ads(SourceBitmap: TBitmap;
          out DestBitmap: TBitmap; Angle10: ShortInt);
type
  PixelArray=array [0..32768] of TRGBTriple;
  pPixelArray=^PixelArray;


Const
  Angle: array [-1..1] of integer = (-90, 180, 90);

var
  cosRadians : Double;
  inX : Integer;
  inXOriginal : Integer;
  inXPrime : Integer;
  inXPrimeRotated : Integer;
  inY : Integer;
  inYOriginal : Integer;
  inYPrime : Integer;
  inYPrimeRotated : Integer;
  OriginalRow : pPixelArray;
  Radians : Double;
  RotatedRow : pPixelArray;
  sinRadians : Double;

  Center: TPoint;

  function Chot(const dd:integer) : integer;
  begin
   Chot:= dd - (dd mod 2);
  end;

begin

  case Angle10 of
            -1: begin
                 DestBitmap.Height := Chot(SourceBitmap.Width);
                 DestBitmap.Width := Chot(SourceBitmap.Height);
                 Center.X:= SourceBitmap.Width div 2;
                 Center.Y:= SourceBitmap.Width div 2;
                end;
             0: begin
                 DestBitmap.Width := Chot(SourceBitmap.Width);
                 DestBitmap.Height := Chot(SourceBitmap.Height);
                 Center.X:= DestBitmap.Width div 2;
                 Center.Y:= DestBitmap.Height div 2;
                end;
             1: begin
                 DestBitmap.Height := Chot(SourceBitmap.Width);
                 DestBitmap.Width := Chot(SourceBitmap.Height);
                 Center.X:= SourceBitmap.Height div 2;
                 Center.Y:= SourceBitmap.Height div 2;
                end;
  end;

  DestBitmap.PixelFormat := pf24bit;
  Radians := -(Angle[Angle10]) * PI / 180;
  sinRadians := Sin(Radians);
  cosRadians := Cos(Radians);
  for inX := DestBitmap.Height-1 downto 0 do
  begin
    RotatedRow := DestBitmap.Scanline[inX];
    inXPrime := 2*(inX - Center.y) + 1;
    for inY := DestBitmap.Width-1 downto 0 do
    begin
      inYPrime := 2*(inY - Center.x) + 1;
      inYPrimeRotated := Round(inYPrime * CosRadians - inXPrime * sinRadians);
      inXPrimeRotated := Round(inYPrime * sinRadians + inXPrime * cosRadians);
      inYOriginal := (inYPrimeRotated - 1) div 2 + Center.x;
      inXOriginal := (inXPrimeRotated - 1) div 2 + Center.y;
      if (inYOriginal >= 0) and (inYOriginal <= SourceBitmap.Width-1) and
      (inXOriginal >= 0) and (inXOriginal <= SourceBitmap.Height-1) then
      begin
        OriginalRow := SourceBitmap.Scanline[inXOriginal];
        RotatedRow[inY] := OriginalRow[inYOriginal];
      end
      else
      begin
        RotatedRow[inY].rgbtBlue := 255;
        RotatedRow[inY].rgbtGreen := 0;
        RotatedRow[inY].rgbtRed := 0
      end;
    end;
  end;
end;
Работает все хорошо, но ооочень долго. И мне уже писали, что "а зачем тебе тригонометрия"

В общем. Можете помочь сделать процедуру поворачивающую на 90 или 180 градусов без тригонометрии, так чтобы быстрее работало?
Kronos913 вне форума
Старый 05.06.2021, 13:32   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Так вам уже отвечали - https://www.programmersforum.ru/show...92#post1830092
Зачем однотипные темы плодить?
Arigato вне форума
Старый 05.06.2021, 13:56   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 622
По умолчанию

Что характерно
Попробовал вот такой вот код:
Код:
      DestBitmap.Height:=SourceBitmap.Height;
      DestBitmap.Width:=SourceBitmap.Width;
      For j:=0 to DestBitmap.Height-1 do begin
       For i:=0 to DestBitmap.Width-1 do begin
        DestBitmap.Canvas.Pixels[i, j]:=SourceBitmap.Canvas.Pixels[SourceBitmap.Width-i, SourceBitmap.Height-j]
       end;
      end;
Работает раз в 10 ДОЛЬШЕ
Kronos913 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поворот текста на 180 градусов kizim1970 Microsoft Office Word 4 30.11.2017 09:05
поворот матрицы на 180 градусов Felixjkee Помощь студентам 0 09.01.2013 11:18
поворот изображения на форме (либо поворот файла с картинкой) mystiql Microsoft Office Access 2 21.06.2011 22:03
поворот матрицы на 180 и 270 градусов Alex1123 Помощь студентам 4 25.05.2011 18:31
помогите оптимизировать! kievlyanin Microsoft Office Excel 11 28.04.2009 14:19