Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.035 c
2-1128424209
Гость22
2005-10-04 15:10
2005.10.30
Простой вопрос. Но не знаю, как решить.


14-1128783936
Piter
2005-10-08 19:05
2005.10.30
Сборная России - сборная Люксембурга


6-1120660294
Gold
2005-07-06 18:31
2005.10.30
IdPOP31.Retrieve - утечка памяти!! ??


2-1128423393
nk
2005-10-04 14:56
2005.10.30
Запись CD-R(W)


4-1125140770
NikNet
2005-08-27 15:06
2005.10.30
Как правельно использовать GetFullPathName?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский