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

Вниз

Bitmap.PixelFormat   Найти похожие ветки 

 
SMATMP ©   (2005-09-26 13:52) [0]

Уважаемые мастера! Как отличить формат Color256 от Gray? Функция Bitmap.PixelFormat возвращает в обоих случаях значение pf8bit...


 
MBo ©   (2005-09-26 14:06) [1]

>формат Color256 от Gray

А что это за форматы такие???


 
icWasya ©   (2005-09-26 14:57) [2]

только считывать палитру и проверять значения цветов
что нибудь типа

function IsGrayPal(Palette:HPalette):Boolean;
var
 TestLogPal: TMaxLogPalette;
 LogPal: TLogPalette Absolute TestLogPal;
var I: Integer;

begin
 FillChar(TestLogPal,SizeOf(TestLogPal),0);
 Result:=False;
 GetPaletteEntries(Palette, 0, 256 ,LogPal);
 for I:=0 to 255 do with TestLogPal.palPalEntry[I] do begin
   if peRed    <>I then Exit;
   if peGreen  <>I then Exit;
   if peBlue   <>I then Exit;
   //if peFlags  <>0 then Exit;
 end;
 Result:=True;
end;

if not IsGrayPal(BMP.Palette) then
 ShowMessage("Цветные рисунки не обрабатываем!!");


 
SMATMP ©   (2005-09-26 15:20) [3]

Хмм... Ну...
Виндовый графический BMP-файл (и не только) может иметь 1, 8, 16, 24 и др. количество бит на один пиксель. Однобитный понятно - черно-белый рисунок. А вот, скажем, восьмибитный рисунок может быть как цветным (можно увидеть, скажем, в настройке дисплея(видеоадаптера) компьютера (ПУСК\Настройка\Панель управления\Экран, Настройка\Цветовая палитра), так и "псевдочернобелым" (оттенки серого или GRAY). И первая и вторая цветовая гамма умещается в 256 цветов (1 байт, или 8 бит). Функция Delphi Bitmap.PixelFormat определяет только сколько бит отводится под один пиксель, а вот цветное это изображение (256 цветов) или серое (256 оттенков) она не позволяет выяснить. Вот и возникает вопрос: каким методом или с помощью какой функции можно определить ЭТО. Спасибо за внимание.


 
SMATMP ©   (2005-09-26 15:40) [4]

Спасибо, icWasya. Метод на мой взгляд не лишен смысла. Однако представленная функция IsGrayPal почему то возвращает False всегда (и для 256color и для gray и даже для Black&White). Поскольку не являюсь продвинутым программистом, а отношу себя скорее к начинающим - прошу сделать кооректировку функции. Попутно: может быть в недокументировааных функциях есть аналог свойства Monochrome?


 
Джо ©   (2005-09-26 17:30) [5]

Изображение в "отенках серого" (так называемый Greyscale), записанное в формате 8 bits per pixel НИЧЕМ не отличается от обычного "цветного" рисунка с 8 bits per pixel. Нигде не хранится информация о том, "серый" он или "цветной". Формат рисунка одинаковый - цвета определены в палитре, количество элементов палитры - 256. Это общие соображения.

Теперь то, что из них следует. А следует из них то, что тебе придется самому определиться, какой цвет считать "цветным", а какой - "серым".  В любом случае, без анализа не обойтись. Я предлагаю пройтись по элементам палитры и преобразовывать каждый цвет из формата RGB в формат LAB. Дело в том, что для оттенков серого значения A и B равны 0. Соответственно,  дойдя до первого же элемента палитры, у которого A<>B<>0 ты сможешь заключить, что рисунок - "не в оттенках серого".

Функции перевода RGB --> LAB в Сети есть. Так что - все для решения задачи у тебя есть - вперед :)

П.С. Monochrome - это именно монохром. То есть - есть "черно/белый". Никакого отношения к GrayScale не имеет.


 
Sapersky   (2005-09-27 12:08) [6]

Однако представленная функция IsGrayPal почему то возвращает False всегда

Видимо, из-за того, что grayscale палитра может быть нелинейной (с гамма-коррекцией) или со сдвигом. Лучше проверять так:

if (peRed <> peGreen) or (peRed <> peBlue) then Exit;

Или для надёжности учитывать погрешность (MaxError, допустим, 16 - будет возвращать true для "с виду серых" картинок, хотя на самом деле они могут быть слегка цветными):

if ( Abs(peRed - peGreen) > MaxError ) or
  ( Abs(peRed - peBlue) > MaxError ) or
  ( Abs(peGreen - peBlue) > MaxError ) then Exit;


 
vrem   (2005-09-27 19:24) [7]

Если grayscale - зачем хранить палитру? Может и не хранится, сохранено как цветной, а рисунок чернобелый


 
SMATMP ©   (2005-09-30 18:37) [8]

ОК, Sapersky! Функция работат. Однвко у меня есть вопрос, почему MaxError= конкретно 16? В чем соль метода? Честно сказать, я уже думал, что надо искать инфу по формату BMP и вытаскивать Color или Gray непосредственно из файла рисунка.


 
SMATMP ©   (2005-09-30 18:38) [9]

ОК, Sapersky! Функция работат. Однако у меня есть вопрос, почему MaxError= конкретно 16? В чем соль метода? Честно сказать, я уже думал, что надо искать инфу по формату BMP и вытаскивать Color или Gray непосредственно из файла рисунка.


 
SMATMP ©   (2005-10-07 17:37) [10]

Хотел было уже написать, что есть проблема, однако справился самостоятельно.
Дело в том, что если хотя бы однажды загрузить в TImage 24-битный рисунок, функция IsGrayPal (с исправлениями) уже не срабатывает. Не знаю как еще можно было исправить положение, я вылечил этот недостаток путем обнуления битмапа Image перед загрузкой туда нового образа:

Image1.Picture.Bitmap := nil;

Тогда для 8-битных рисунков все работает.
Спасибо еще раз.



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

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

Наверх




Память: 0.49 MB
Время: 0.103 c
5-1105351198
Siargey
2005-01-10 12:59
2005.10.30
Создание редактора свойств


14-1128479169
КаПиБаРа
2005-10-05 06:26
2005.10.30
Задача про таракана


4-1121277980
Nikon
2005-07-13 22:06
2005.10.30
Ошибка в Hook ?


9-1118294046
X-Disa
2005-06-09 09:14
2005.10.30
TDXDraw не на форме


14-1128680608
__DATA__
2005-10-07 14:23
2005.10.30
Для чего исползуется протокол NetBios?