Как я могу проверить глубину цвета Битового массива?

Я работаю над приложением, которое печатает папку файлов изображений, включая JPEG и TIFF. Изображения в формате TIFF являются обычно Черными и Белыми (1 бит/пкс).

После загрузки изображения я хочу определить, является ли изображение Цветом или B&W или Шкалой полутонов, таким образом, я могу отправить изображение на правильный принтер (цветной принтер или черно-белый принтер).

Я использую Bitmap конструктор image = new Bitmap(filename); загрузить изображение.

Править: Ответ для проверки пиксельной глубины является большим для B&W. Какие-либо идеи проверить, является ли изображение шкалой полутонов, не выполняя итерации через каждый пиксель?

8
задан Chris Thompson 27 January 2010 в 23:46
поделиться

2 ответа

Правильный способ проверить это:

для файлов JPEG Вы должны проверить соответствующие свойства, используя свойствующие свойства сбора растрового изображения. Это может содержать соответствующие exif теги, которые помогут определить глубину битов. Следующим шагом будет разбираться в разборе заголовка JPEG и ищите маркер «Начало рамки», а затем количество компонентов на изображении.

Конечный метод заключается в том, чтобы загрузить JPEG в Bitmap Object и сравнить количество пикселей с форумом (ширина * высота * bytes_per_pixel). Поэтому, если вы загружаете растровое изображение и количество байтов фактических необработанных данных, равны (высоту ширины *), то вы знаете, что это безопасная ставка, что изображение имеет 1 байт на пиксель и как таковое, это серого.

Последнее, что вы захотите проверить, это Pixelformat самого растрового изображения.

Для формата файла вы должны сделать то же самое, используя коллекцию свойств и проверьте соответствующую тег, упомянутую в спецификации. Если они потерпят неудачу, затем сделайте сравнение байта изображения и, наконец, используйте свойство Pixelformat в качестве последнего курорта.

3
ответ дан 5 December 2019 в 14:03
поделиться

Позвольте мне попробовать еще раз....

CREATE FUNCTION saneDecimal(@input decimal(5,2)) returns varchar(10)
AS
BEGIN
DECLARE @output varchar(10)
SET @output = CAST(@input AS varchar(10))

DECLARE @trimmable table (trimval char(1))
INSERT @trimmable VALUES ('0')
INSERT @trimmable VALUES ('.')

WHILE EXISTS (SELECT * FROM @trimmable WHERE trimval = CAST(SUBSTRING(@output, LEN(@output), 1) AS char(1)))
    SET @output = LEFT(@output, LEN(@output) - 1)

RETURN @output
END

GO

SELECT dbo.saneDecimal(1.00)
-121--3107607-

Возможно, более подходящим является рингбуфер. Это не список, хотя вполне вероятно, что он может вести себя достаточно, как список для ваших целей.

Проблема заключается в том, что эффективность сдвига в списке равна O (n), что становится значительным для достаточно больших списков.

Переключение в рингбуфере - это просто обновление местоположения головки, которое равно O (1)

-121--580102-

Просто проверьте это свойство

image.PixelFormat

Оно будет соответствовать одному из значений в System.Drawing.Imaging.PixelFormat

Хотя вы бы хотели отправить больше, чем просто черно-белый на B & W принтер, вы также должны отправить любые серые весы туда.

9
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: