![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Преобразование картинок [D6, Win2k, WinXP]
Fostr © (2005-09-24 22:07:00)Здравствуйте! Есть две картики (Jpg). Моя задача сделать плавный переход одной картики в другую. С помощью доступа к пикселям (MyPic.Canvas.Pixels[x,y]) эта задача работает чрезвычайно медленно. Знаю, что ScanLine решает подобные проблемы со коростью. Вопрос: пожалуйста, подскажите как именно можно решить задачу с помощью ScanLine?
Sapersky (2005-09-26 11:33:00) [1]Из-за того, что при обращении к свойству Pixels вызываются Get/Set функции и ещё куча внутри них. Из-за преобразования цвета в к 24-битному формату, если на самом деле другой.
В FastLib ( http://prdownloads.sourceforge.net/skinner/FastLib.zip?download) Pixels реализован как двумерный массив-указатель, для каждого формата отдельно, например, для 24 бит:
TFColor = packed record
b,g,r: Byte;
end;
TLine24 = array[Word]of TFColor; PLine24 =^TLine24;
TPixels24 = array[Word]of PLine24; PPixels24 =^TPixels24;
Pixels24: PPixels24; // typed scanlines - Pixels24[y,x]: TFColor
И довольно шустро работает. Хотя Scanlines всё-таки быстрее.
GrayFace (2005-09-25 19:52:00) [2]PAVIA © (24.09.05 22:37) [1]
ScanLine выигрывает за счет, того что каждый раз не нужно преводить координаты x,y в линейный адрресс используя медленную операцию умножения l=y*Bitmap.width +x.
Вовсе нет. Как я помню, работа с пикселями в 100 раз медленнее, чем работа со Scanline'ом.
Fenik (2005-09-25 10:56:00) [3]http://delphibase.spb.ru/?action=viewfunc&topic=mediaimg&id=10300
http://www.delphimaster.ru/articles/pixels/index.html
MBo (2005-09-25 07:26:00) [4]В Статьи загляни
Fostr (2005-09-24 22:45:00) [5]С английским у меня проблем нет, спасибо. Хелпом пользоваться умею, но любому иногда что-то бывает непонятным. В любом случае спасибо за разъянения.
PAVIA (2005-09-24 22:37:00) [6]Запомни есть кнопка F1 Help называеться, по русски будет справка.
type
TRGB=record r,g,b:byte; end;
PRGBArray = ^TByteArray;
TRGBArray = array[0..32767] of TRGB;
//...
var p:PRGBArray;
//...
//тут загрузка картинки преоброзование ее в BMP 24bit
//...
for y := 0 to Bitmap.height -1 do
begin
P := Bitmap.ScanLine[y];
for x := 0 to Bitmap.width -1 do
begin
P[x]-лежит цвет. Делаешь свои преоброзования.
end;
end;
ScanLine выигрывает за счет, того что каждый раз не нужно преводить координаты x,y в линейный адрресс используя медленную операцию умножения l=y*Bitmap.width +x.