Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

Можно ли?   Найти похожие ветки 

 
apl   (2006-08-10 12:41) [0]

Подскажите, как можно преобразовать цветовую модель у очень большого кол-ва небольших графических файлов. Допустим из RGB в Grayscale256.
Задача разовая, не хотелось-бы тратить время на отладку подобного. Возможно ли это сделать при помощи TImage (как варианты - компоненты OrImage, ImageEn)


 
Jeer ©   (2006-08-10 13:45) [1]

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;


 
antonn ©   (2006-08-10 18:01) [2]

воспользоваться сканлайном:
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 18:29) [3]


> //веса взял из [1], т.к не помню их. Вроде еще нужно умножить
> на (100/255)


Не поверишь, но байт умноженный на double и приведенный к целому, наложенному опять же на байт - никак больше, чем 255 не даст.


 
Don Nikola ©   (2006-08-10 21:00) [4]

А с каких пор умножение нецелых+округление стало быстрее умножения целых+сдвиг?


 
Styx_   (2006-08-10 21:14) [5]

А может, проще макрос в Photoshop сделать?


 
antonn ©   (2006-08-11 04:22) [6]

Jeer ©   (10.08.06 18:29) [3]
я не проверял, у меня дельфи уже нет, и по памяти в час ночи тоже не очень пишется:)
а вообще, побоялся, чтобы цвет был не больше 255, а был слишком маленький, вот и комментнул на всякий случай:)
еще забыл написать ST:=TStringlist.create; и ST.free;

Don Nikola ©   (10.08.06 21:00) [4]
а где утверждалось что либо подобное?


 
Don Nikola ©   (2006-08-11 04:46) [7]

2antonn:
прямо нигде, но все примеры с флоатами.
потом эти примеры по инету расползутся, кто-то их использует как-есть, сделает "поделку из лобзика", увидет скорость и начнет вопить "дельфи ацтой". вот такой вот страшный масонский заговор по дискредитации дельфей.

p.s.: ;)


 
Jeer ©   (2006-08-11 10:23) [8]

Don Nikola ©   (11.08.06 04:46) [7]

Кривым мозгам туда и дорога.



Страницы: 1 вся ветка

Текущий архив: 2006.09.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.047 c
2-1157215052
disPATCHer
2006-09-02 20:37
2006.09.24
Проблема с .pas файлом


4-1141971209
balepa
2006-03-10 09:13
2006.09.24
Процессы и сокеты


11-1132663743
BaryV
2005-11-22 15:49
2006.09.24
Как скрыть у TabControl вкладки?


2-1157398753
TimScorp
2006-09-04 23:39
2006.09.24
FreeReport


15-1157363915
umbra
2006-09-04 13:58
2006.09.24
Линукс. Как из tar-фрхива извлечь конкретный файл/каталог?