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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2021, 04:01   #21
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Работает раз в 10 ДОЛЬШЕ
Взял коды с Pixels и со Scanline. На одном и том же изображении (850 на 320 пикселей) первый работает 2 миллиона тиков, а второй - 5 тысяч тиков. Какого размера у вас изображения, если хочется еще быстрее?
Цитата:
Сообщение от Kronos913 Посмотреть сообщение
не хочет напрямую
Что значит напрямую? Изображение в памяти лежит построчно, поэтому сразу присвоить строке столбец не получится.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.06.2021, 10:54   #22
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 622
По умолчанию

Цитата:
Что значит напрямую? Изображение в памяти лежит построчно, поэтому сразу присвоить строке столбец не получится.
Scanline не хочет работать напрямую. Только через присвоение указателя...
Как не пытаюсь написать код напрямую - выдает ошибку
Kronos913 вне форума Ответить с цитированием
Старый 06.06.2021, 19:43   #23
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Scanline не хочет работать напрямую
Что значит напрямую? Scanline просто возвращает указатель.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.06.2021, 19:57   #24
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 622
По умолчанию

В том плане что для того чтобы обратиться к пикселям через скайнлайн, приходится так делать:
Код:
type
  PixelArray=array [0..32768] of TRGBTriple;
  pPixelArray=^PixelArray;
Код:
var
  OriginalRow : pPixelArray;
  RotatedRow : pPixelArray;
Код:
RotatedRow := DestBitmap.Scanline[j];
OriginalRow := SourceBitmap.Scanline[DestBitmap.Height-j-1];
Код:
RotatedRow[i]:=OriginalRow[DestBitmap.Width-i-1];
А есть ли какой-то способ напрямую это сделать?
То есть на создавая еще один указатель, которому присваивать какую-то строку, а напрямую

Как-то так. Я так пробовал, но выходила ошибка
Код:
DestBitmap.Scanline[j][i]:=SourceBitmap.Scanline[i][j]
Есть ли возможность работать со Scanline без еще одного массива указателей?
Kronos913 вне форума Ответить с цитированием
Старый 06.06.2021, 20:15   #25
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
без еще одного массива указателей?
Это не массив указателей, а указатель на массив. В памяти эта переменная займет всего несколько байт.
Arigato вне форума Ответить с цитированием
Старый 06.06.2021, 20:24   #26
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 622
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Это не массив указателей, а указатель на массив. В памяти эта переменная займет всего несколько байт.
Тут скорее дело в том, что после каждой строки нужно указателю присваивать другое значение. В первоначальной версии кода, поворот на 90 градусов занимал много времени из-за того что на каждом пикселе приходилось менять куда ссылается переменная-указателя. Пока я не нашел выход делать через еще один массив - ускорилось раз в 10

Но все же вопрос в том, можно ли обойтись без дополнительной переменной-указателя? Или только через нее и иначе никак?
Kronos913 вне форума Ответить с цитированием
Старый 06.06.2021, 20:47   #27
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
можно ли обойтись без дополнительной переменной-указателя?
А чем она мешает?

Вот пример переворота изображения:
Код:
procedure RotateBitmap180(SourceBitmap: TBitmap; var DestBitmap: TBitmap);
var
  i, j, Len: Integer;
  ps, pd: ^TRGBTriple;
begin
  DestBitmap.Width := SourceBitmap.Width;
  DestBitmap.Height := SourceBitmap.Height;
  DestBitmap.PixelFormat := SourceBitmap.PixelFormat;
  Len := SizeOf(TRGBTriple) * SourceBitmap.Width;
  j := DestBitmap.Height - 1;
  for i := 0 to SourceBitmap.Height - 1 do begin
    ps := SourceBitmap.ScanLine[i];
    pd := DestBitmap.ScanLine[j];
    Move(ps^, pd^, Len);
    Dec(j);
  end;
end;
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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