Текущий архив: 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.47 MB
Время: 0.047 c