![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли?
apl © (2006-08-10 12:41:00)Подскажите, как можно преобразовать цветовую модель у очень большого кол-ва небольших графических файлов. Допустим из RGB в Grayscale256.
Задача разовая, не хотелось-бы тратить время на отладку подобного. Возможно ли это сделать при помощи TImage (как варианты - компоненты OrImage, ImageEn)
Jeer (2006-08-11 10:23:00) [1]Don Nikola © (11.08.06 04:46) [7]
Кривым мозгам туда и дорога.
Don Nikola (2006-08-11 04:46:00) [2]2antonn:
прямо нигде, но все примеры с флоатами.
потом эти примеры по инету расползутся, кто-то их использует как-есть, сделает "поделку из лобзика", увидет скорость и начнет вопить "дельфи ацтой". вот такой вот страшный масонский заговор по дискредитации дельфей.
p.s.: ;)
antonn (2006-08-11 04:22:00) [3]Jeer © (10.08.06 18:29) [3]
я не проверял, у меня дельфи уже нет, и по памяти в час ночи тоже не очень пишется:)
а вообще, побоялся, чтобы цвет был не больше 255, а был слишком маленький, вот и комментнул на всякий случай:)
еще забыл написать ST:=TStringlist.create; и ST.free;
Don Nikola © (10.08.06 21:00) [4]
а где утверждалось что либо подобное?
Styx_ (2006-08-10 21:14:00) [4]А может, проще макрос в Photoshop сделать?
Don Nikola (2006-08-10 21:00:00) [5]А с каких пор умножение нецелых+округление стало быстрее умножения целых+сдвиг?
Jeer (2006-08-10 18:29:00) [6]
> //веса взял из [1], т.к не помню их. Вроде еще нужно умножить
> на (100/255)
Не поверишь, но байт умноженный на double и приведенный к целому, наложенному опять же на байт - никак больше, чем 255 не даст.
antonn (2006-08-10 18:01:00) [7]воспользоваться сканлайном:
procedure PrepareBitmap(var _B_out:Tbitmap);
const MaxPixelCount = MaxInt div SizeOf(TRGBTriple);
type PRGBArray = ^TRGBArray;
TRGBArray = array[0..MaxPixelCount-1] of TRGBTriple;
var x, y: Integer; RowOut: PRGBArray;
begin
_B_out.PixelFormat:=pf24bit;
for y:=0 to _B_out.Height-1 do begin
RowOut:= _B_out.ScanLine[y];
for x:=0 to _B_out.Width-1 do begin
//веса взял из [1], т.к не помню их. Вроде еще нужно умножить на (100/255)
RowOut[x].rgbtRed:=round(RowOut[x].rgbtRed*0.30);
RowOut[x].rgbtGreen:=round(RowOut[x].rgbtGreen*0.59);
RowOut[x].rgbtBlue:=round(RowOut[x].rgbtBlue*0.11);
end;
end
end;
и вызывать ее для всех битмапов, примерно так:
var i:integer; ST:TStrings; _BT:TBitmap;
begin
_BT:=Tbitmap.create;
try
//тут в ST нужно поместить пути к bmp-файлам (из opendialogs или еще как...)
for i:=0 to ST.items.count-1 do begin
_BT.loadfromfile(ST.strings[i]);
PrepareBitmap(_BT);
_BT.savetofile(ST.strings[i]+'_pr.bmp');
end;
finally
_BT.free;
end;
end;
Jeer (2006-08-10 13:45:00) [8]RGB и GrayScale256 - одна и та же цветовая модель, т.е. RGB.
Если разовая задача, то и программировать незачем.
Фотошоп + скрипт или аналогичные.
Если приспичило в Delphi - достаточно TBitmap.LoadFromFile и
попиксельно:
function RGB2Gray(pxs: TColor) : TColor;
var pxt: Byte;
begin
pxt := round((0.30 * GetRValue(pxs)) +
(0.59 * GetGValue(pxs)) +
(0.11 * GetBValue(pxs)));
Result := RGB(pxt, pxt, pxt);
end;