![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
попиксельное изменение
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 (если она в другом формате), и, осознавая структуру файла, меняем в нем значения серого цвета на значения белого.