![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Количество уникальных цветов в изображении [D7, WinXP]
Ricks © (2007-03-09 23:03:00)Каким образом это можно подсчитать?
Сотрудник деканата (2007-03-12 10:13:00) [1]Неопримизированный вариант для TBitmap
http://kladovka.net.ru/delphibase/?action=viewfunc&topic=mediaimg&id=10173
SamBrook (2007-03-10 12:53:00) [2]В XnView есть соответствующая утилита
Ricks (2007-03-10 12:06:00) [3]Спасибо, попробую!
Sapersky (2007-03-10 10:56:00) [4]Создать массив цветов, пройти по картинке, для каждого пикселя проверить - если его нет в массиве, увеличить счётчик, занести цвет в массив. Например, так:
( http://sourceforge.net/project/showfiles.php?group_id=173551)
function Count24(Bmp:TFastDIB):Integer;
type
PCheck =^TCheck;
TCheck = array[Byte,Byte,0..31]of Byte;
var
pb: PByte;
pc: PFColor;
Check: PCheck;
x,y,c: Integer;
begin
Result:=0;
New(Check);
FillChar(Check^,SizeOf(TCheck),0);
pc:=Pointer(Bmp.Bits);
for y:=0 to Bmp.AbsHeight-1 do begin
for x:=0 to Bmp.Width-1 do begin
pb:=@Check[pc.r,pc.g,pc.b shr 3];
c:=1 shl(pc.b and 7);
if(c and pb^)=0 then begin
Inc(Result);
pb^:=pb^ or c;
end;
Inc(pc);
end;
pc:=Ptr(Integer(pc)+Bmp.Gap);
end;
Dispose(Check);
end;
Массив [Byte,Byte,0..31] of Byte - это, в некотором смысле, эмуляция массива [Byte,Byte,Byte] of Bit. Можно написать просто [Byte,Byte,Byte] of Byte, но тогда функция потребует 16 мб памяти вместо 2.
Можно попробовать одномерный динамический массив цветов, памяти потребуется меньше, но будет намного медленнее.