Я работаю над приложением, которое печатает папку файлов изображений, включая JPEG и TIFF. Изображения в формате TIFF являются обычно Черными и Белыми (1 бит/пкс).
После загрузки изображения я хочу определить, является ли изображение Цветом или B&W или Шкалой полутонов, таким образом, я могу отправить изображение на правильный принтер (цветной принтер или черно-белый принтер).
Я использую Bitmap
конструктор image = new Bitmap(filename);
загрузить изображение.
Править: Ответ для проверки пиксельной глубины является большим для B&W. Какие-либо идеи проверить, является ли изображение шкалой полутонов, не выполняя итерации через каждый пиксель?
Правильный способ проверить это:
для файлов JPEG Вы должны проверить соответствующие свойства, используя свойствующие свойства сбора растрового изображения. Это может содержать соответствующие exif теги, которые помогут определить глубину битов. Следующим шагом будет разбираться в разборе заголовка JPEG и ищите маркер «Начало рамки», а затем количество компонентов на изображении.
Конечный метод заключается в том, чтобы загрузить JPEG в Bitmap Object и сравнить количество пикселей с форумом (ширина * высота * bytes_per_pixel). Поэтому, если вы загружаете растровое изображение и количество байтов фактических необработанных данных, равны (высоту ширины *), то вы знаете, что это безопасная ставка, что изображение имеет 1 байт на пиксель и как таковое, это серого.
Последнее, что вы захотите проверить, это Pixelformat самого растрового изображения.
Для формата файла вы должны сделать то же самое, используя коллекцию свойств и проверьте соответствующую тег, упомянутую в спецификации. Если они потерпят неудачу, затем сделайте сравнение байта изображения и, наконец, используйте свойство Pixelformat в качестве последнего курорта.
Позвольте мне попробовать еще раз....
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 принтер, вы также должны отправить любые серые весы туда.