ImageConverter байт a

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

ImageConverter converter = new ImageConverter();
byte[] test = (byte[])converter.ConvertTo(gpuMatch.Bitmap,typeof(byte[]));

изображение представляет собой оттенки серого 792x410 с глубиной цвета 8 бит. так что размер массива не должен быть 324720 байт? я получаю что-то близкое к 140122 элементам в массиве байтов.

ImageConverter ic = new ImageConverter();
Image img = (Image)ic.ConvertFrom(test);

если я переконвертирую байты в изображение, изображение останется нетронутым. может кто-нибудь объяснить, почему это несоответствие?

спасибо каннан


person kannan    schedule 23.09.2013    source источник
comment
Возможно, вам следует рассказать своей аудитории, на каком языке программирования мы работаем и какой ImageConverter вы используете?   -  person Scheintod    schedule 23.09.2013
comment
Я прошу прощения. Я использую VS2010, С#, .net4.0. и класс system.Drawing.ImageConverter   -  person kannan    schedule 23.09.2013


Ответы (3)


Возвращаемый массив байтов не является необработанным представлением изображения, где один байт соответствует одному пикселю. Вместо этого это зависит от формата изображения. Таким образом, вы получите разные результаты для jpeg, gif, png и так далее.

Думаю будет полезна эта ссылка:

http://www.vcskicks.com/image-to-byte.php

(это взято из этого ответа: Преобразование растрового изображения в байт массив)

Связанная страница гласит:

Что нужно помнить об ImageConverter, так это то, что изображение будет напрямую преобразовано в байты. Таким образом, изображение в формате bmp и такое же изображение в формате png НЕ будут иметь один и тот же массив байтов. Поэтому, если вы хотите, например, сравнить два изображения, вам нужно убедиться, что они первые в одном и том же формате, прежде чем сравнивать их массивы байтов.

Итак, я думаю, вы заметите, что массив байтов всегда будет примерно такого же размера, как файл изображения, который вы читаете.

person Scheintod    schedule 23.09.2013
comment
Заставляет меня задаться вопросом, какое возможное применение ImageConverter может быть лучше, чем Image.Save(memstream, format) или, черт возьми, File.ReadAllBytes(path). - person Nyerguds; 09.01.2018

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

Спасибо, Дэйв

person TheDaveJay    schedule 23.09.2013

когда я использую метод потока, я получаю фактические шестнадцатеричные данные. очевидно, конвертер изображений использует тип изображения (по умолчанию PNG?) в процессе преобразования байтов. отсюда и несоответствие размера массива байтов.

спасибо за поддержку, каннан

person kannan    schedule 25.09.2013