Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

попиксельное изменение


bagos ©   (2007-06-23 07:49:00) 

мастера,научите попиксельно изменять цвет, есть картинка 2 цвета,серый и черный, задача такая: нужно поменять серый цвет на белый,я полагаю что это нужно делать попиксельно проверяя чему равен пиксель.
с чего начать не знаю


homm   (2007-06-25 00:19:00) [1]

> Перебор попиксельно будет в любом случае.

Естественно :) В данном случае разговор конкретно о Pixels.


ppcumax   (2007-06-25 00:18:00) [2]

Понял. Спасибо


KilkennyCat   (2007-06-25 00:14:00) [3]

Так и узнать, но наоборот: Цвет := Canvas.Pixels[20,20]


ppcumax   (2007-06-25 00:06:00) [4]

Вопрос по теме: как узнать цвет пикселя? например Canvas.Pixels[20,20] := Цвет


DVM   (2007-06-24 23:38:00) [5]


> homm ©   (24.06.07 19:17) [5]

Перебор попиксельно будет в любом случае. Разница лишь в том как эти пикселы брать - поодиночке или скопом. Другого пути нет. Если конечно битмап 24-32 битный.


homm   (2007-06-24 23:27:00) [6]

> Это ответ по теме?

Разве нет? Ты предложил 2 пути, я уточнил что один не верен.


DVM   (2007-06-24 23:19:00) [7]

procedure BitmapProcessing(Bmp: TBitmap);
const
 PixelCountMax = 32768;
type
 pRGBArray  = ^TRGBArray;
 TRGBArray   = array[0..PixelCountMax - 1] of TRGBTriple;
var
 r,g,b: byte;
 h, w: integer;
 Row: pRGBArray;
begin
 if bmp.PixelFormat <> pf24bit then exit;
 for h := 0 to bmp.height - 1 do
   begin
     Row := pRGBArray(bmp.Scanline[h]);
     for w := 0 to bmp.width - 1 do
       begin
         r := Row[w]^.rgbtRed;
         g := Row[w]^.rgbtGreen;
         b := Row[w]^.rgbtBlue;
         // Тут делаем все что надо проверяем какой цвет и т.д.
         // результат кладем обратно в Row[w]
       end;
   end;
end;

Не надо забывать только про pf24bit


KilkennyCat   (2007-06-24 23:02:00) [8]


> homm ©   (24.06.07 19:17) [5]


Это ответ по теме?


homm   (2007-06-24 19:17:00) [9]

> При простом переборе в цикле попиксельно скорость работы
> будет оставлять желать лучшего (хотя, при современых-то
> мощностях... может и хватит).

Современные мощнастя можно тратить и на более полезные вещи, нежели дурь программиста.


Anatoly Podgoretsky   (2007-06-23 12:36:00) [10]

> bagos  (23.06.2007 07:49:00)  [0]

Что за картинка, где картинка, какой формат, какие размеры, как много их, как часто надо делать, какие требования к скорости, какие у тебя начальные знания?


Инс   (2007-06-23 09:34:00) [11]

Если картинка имеет палитру, до достаточо изменить в последней одно значение. Это будет быстрее всего.


Однокамушкин   (2007-06-23 09:14:00) [12]


> KilkennyCat ©   (23.06.07 08:54) [1]
> При простом переборе в цикле попиксельно скорость работы
> будет оставлять желать лучшего (хотя, при современых-то
> мощностях... может и хватит).
> В этом случае стоит обратить внимание на TBitmap.ScanLine.

Да, ScanLine - это быстрее, но надо сначала убедиться, что HandleType имеет значение bmDIB, потому что в противном случае ScanLine, во-первых, работает очень медленно, а во-вторых, позволяет только читать значения пикселей, но не менять их...

> И учитывая специфику задачи, возможно, наиболее оптимально
> будет работать напрямую с файлом (сохраняем картинку как
> файл формата Bitmap (если она в другом формате), и, осознавая
> структуру файла, меняем в нем значения серого цвета на значения
> белого.

Ну, тут и без файла можно обойтись, сохранять можно в TMemoryStream, структура будет та же, но всё остаётся в памяти...


KilkennyCat   (2007-06-23 08:54:00) [13]


> с чего начать не знаю


Вероятно, с изучения основ работы с графикой, изучение TCanvas и TBitmap
Изменение цвета пиксела особых трудностей не представляет: Canvas.Pixels[x, y] := TColor;

При простом переборе в цикле попиксельно скорость работы будет оставлять желать лучшего (хотя, при современых-то мощностях... может и хватит).
В этом случае стоит обратить внимание на TBitmap.ScanLine.

И учитывая специфику задачи, возможно, наиболее оптимально будет работать напрямую с файлом (сохраняем картинку как файл формата Bitmap (если она в другом формате), и, осознавая структуру файла, меняем в нем значения серого цвета на значения белого.


Наверх

Титульная страница Поиск, карта сайта Написать письмо