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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2021, 21:26   #11
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Это просто идея, через Pixels будет работать медленно, но принцип понятен.
Но по любому быстрее, чем через Sin Cos, думаю.
digitalis вне форума Ответить с цитированием
Старый 20.03.2021, 11:49   #12
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

Тут суть не в скорости, а в том, что для поворота на 90 или 180 градусов никакая тригонометрия не нужна. А для скорости надо использовать ScanLine.
Arigato вне форума Ответить с цитированием
Старый 20.03.2021, 16:15   #13
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
А для скорости надо использовать ScanLine.
А можно подробнее, как это работает, как использовать?
Kronos913 вне форума Ответить с цитированием
Старый 20.03.2021, 16:18   #14
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

Так ведь выше в примере с ненужной тригонометрией как раз ScanLine использовался.
Arigato вне форума Ответить с цитированием
Старый 21.03.2021, 14:06   #15
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Так ведь выше в примере с ненужной тригонометрией как раз ScanLine использовался.
Тот пример я скопировал.
Есть ли какой-то способ напрямую сделать "строка изображения 1 := столбец изображения 2" ?
Kronos913 вне форума Ответить с цитированием
Старый 05.06.2021, 13:56   #16
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Что характерно
Попробовал вот такой вот код:
Код:
      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 вне форума Ответить с цитированием
Старый 05.06.2021, 14:28   #17
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Ок, повозившись, дошел до такого кода

Код:
      DestBitmap.Width:=SourceBitmap.Height;
      DestBitmap.Height:=SourceBitmap.Width;
      For j:=0 to DestBitmap.Height-1 do begin
        RotatedRow := DestBitmap.Scanline[j];
        For i:=0 to DestBitmap.Width-1 do begin
          OriginalRow := SourceBitmap.Scanline[i];
          RotatedRow[i]:=OriginalRow[DestBitmap.Height-j-1];
        end;
      end;
Вопрос: обязательно ли через указатели работать со сканлайном? Или можно напрямую
Потому что при повороде на 180 экономемия по времени да есть, а вот при повороте на 90 экономии от такого кода нет вообще
Kronos913 вне форума Ответить с цитированием
Старый 05.06.2021, 14:57   #18
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Нашел такое решение
Код:
PixAr: array [0..32768] of pPixelArray;
Код:
      DestBitmap.Width:=SourceBitmap.Height;
      DestBitmap.Height:=SourceBitmap.Width;
      For i:= 0 to DestBitmap.Width-1 do PixAr[i]:=SourceBitmap.Scanline[i];

      For j:=0 to DestBitmap.Height-1 do begin
        RotatedRow := DestBitmap.Scanline[j];
        For i:=0 to DestBitmap.Width-1 do begin
          RotatedRow[i]:=PixAr[i][DestBitmap.Height-j-1];
        end;
      end;
Вопрос только в том, есть ли способ лучше? И не будет ли тут переполнений стека?
Kronos913 вне форума Ответить с цитированием
Старый 05.06.2021, 15:08   #19
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Вот полученный код. Можно ли его как-то улучшить?

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

var

  i, j: integer;
  OriginalRow : pPixelArray;
  RotatedRow : pPixelArray;
  PixAr: array [0..32768] of pPixelArray;

begin

  DestBitmap.PixelFormat := pf24bit;
  case Angle10 of
    0: begin
      DestBitmap.Height:=SourceBitmap.Height;
      DestBitmap.Width:=SourceBitmap.Width;
      For j:=0 to DestBitmap.Height-1 do begin
        RotatedRow := DestBitmap.Scanline[j];
        OriginalRow := SourceBitmap.Scanline[DestBitmap.Height-j-1];
        For i:=0 to DestBitmap.Width-1 do begin
          RotatedRow[i]:=OriginalRow[DestBitmap.Width-i-1];
        end;
      end;
    end;
    -1: begin
      DestBitmap.Width:=SourceBitmap.Height;
      DestBitmap.Height:=SourceBitmap.Width;
      For i:= 0 to DestBitmap.Width-1 do PixAr[i]:=SourceBitmap.Scanline[i];

      For j:=0 to DestBitmap.Height-1 do begin
        RotatedRow := DestBitmap.Scanline[j];
        For i:=0 to DestBitmap.Width-1 do begin
          RotatedRow[i]:=PixAr[i][DestBitmap.Height-j-1];
        end;
      end;
    end;
    1: begin
      DestBitmap.Width:=SourceBitmap.Height;
      DestBitmap.Height:=SourceBitmap.Width;
      For i:= 0 to DestBitmap.Width-1 do PixAr[i]:=SourceBitmap.Scanline[DestBitmap.Width-i-1];

      For j:=0 to DestBitmap.Height-1 do begin
        RotatedRow := DestBitmap.Scanline[j];
        For i:=0 to DestBitmap.Width-1 do begin
          RotatedRow[i]:=PixAr[i][j];
        end;
      end;
    end;
  end;

end;
Kronos913 вне форума Ответить с цитированием
Старый 05.06.2021, 15:20   #20
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Я до сих пор только не пойму, почему оно работает только через указатели и не хочет напрямую...
Kronos913 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавить код "Изменить атрибуты файла: создан, изменен, открыт" xpadd91 Visual C++ 0 15.10.2014 20:58
Как повернуть изображение на 180 градусов? kl45gp Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 11.05.2013 13:10
Повернуть изображение tae1980 Microsoft Office Excel 3 20.01.2012 09:39
Повернуть изображение и сохранить результат new player Мультимедиа в Delphi 2 03.11.2011 12:57
Как повернуть изображение в TextBox(e)? Diego__ Microsoft Office Word 10 18.08.2009 12:01