Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.46.18] |
|
Сообщ.
#1
,
|
|
|
К примеру, я перевожу цветное изображение в черно-белое. Это выполняет следующая процедура:
procedure TForm1.MonoChrome1Click(Sender: TObject); var i,j,r,g,b,SvP,W1,W2:integer; begin for i:=0 to Image1.Picture.Width-1 do begin for j:=0 to Image1.Picture.Height-1 do begin SvP:=Image1.Canvas.Pixels[i,j]; w1:=SvP shr 16; w2:=Svp-(w1*$10000); B:=Lo(w1); G:=Hi(W2); R:=Lo(w2); Svp:=round(R*0.3+G*0.59+B*0.11); if SvP>255 then SvP:=255; Image1.Canvas.Pixels[i,j]:=RGB(Svp,Svp,Svp); end; end; end; ___Ну как понятно из кода, изображение хранится в Image1, мы пробегаем попиксельно всё изображение и каждый пиксель переводим в черно-белый формат. ___Но это преобразование занимает уж чересчур много времени (можете протестить). Никто не подскажет более быстрый метод? ___Такая необходимость появилась в связи с тем, что в будущем будет примется осветление изображения, и если одно изменение параметра осветления на +1 (к примеру) будет занимать столько времени - это просто ужас =( |
Сообщ.
#2
,
|
|
|
Используй TBitmap.ScanLine, или http://www.delphimaster.ru/articles/pixels/index.html
|
Сообщ.
#3
,
|
|
|
Спасибо читаю =)
|
Сообщ.
#4
,
|
|
|
А кто может подсказать насчет gdiPlus ? возможно ли работа в этом модуле с изображением попиксельно?
Добавлено вопрос снят. разберусь =) |
Сообщ.
#5
,
|
|
|
Попиксельно и быстро - понятия взаимоисключающие.
Если надо быстро, я бы посоветовал получить указательи на изображение, после чего обрабатывать его командами MMX. |
Сообщ.
#6
,
|
|
|
Цитата Попиксельно и быстро - понятия взаимоисключающие. попиксельно - значит обработать каждый пиксел. Можно быстро, можно медленно. Не взаимоисключающе. В ММХ так же придется работать с "пикселами", представленными 4 байтами. |
Сообщ.
#7
,
|
|
|
Цитата Lamer#1 @ А кто может подсказать насчет gdiPlus ? возможно ли работа в этом модуле с изображением попиксельно? Я могу. Возможна. var BitmapData: TBitmapData; p: pByteArray; // вместо pByteArray - нужное begin GPBitmap.LockBits(MakeRect(0, 0, Width, Height), ImageLockModeRead or ImageLockModeWrite, PixelFormat32bppARGB, BitmapData); try p := BitmapData.Scan0; // p указывает на первый байт изображения finally GPBitmap.UnlockBits(BitmapData); end; end; |
Сообщ.
#8
,
|
|
|
спасибо всем за мнения. думаю пригодятся мне и другим пользователям =)
пока остановился на работе с ScanLine. |
Сообщ.
#9
,
|
|
|
Цитата antonn @ Цитата Попиксельно и быстро - понятия взаимоисключающие. попиксельно - значит обработать каждый пиксел. Можно быстро, можно медленно. Не взаимоисключающе. В ММХ так же придется работать с "пикселами", представленными 4 байтами. Обработка изображения подразумевает три этапа: 1. Чтение данных. 2. Обработка данных. 3. Запись обработанных данных. Соответственно "попиксельно" следует понимать и так: "считать, обработать и записать каждый пиксель". Как, собственно, и было реализовано в примере. Вариант "считать блоком, обработать попиксельно, записать блоком" уже нельзя считать полностью "попиксельной" обработкой. И если не торопиться писать "опровержение", а дать себе труд дочитать мое сообщение до конца (благо, не такое уж оно длинное), то можно понять, что рекомендуется именно переход от первого способа ко второму. |
Сообщ.
#10
,
|
|
|
Спасибо, что поставили меня в угол, плачу.
Не буду разводить оффтоп и ударяться в буквоедство. Но, имхо, canvas.copyrect() не является попиксельной обработкой, а bitmap.pixels[], так же как операции типа pmullw/pxor/pmullw являются попиксельной, хоть по одному пипкселю, хоть по два. |