Чтение данных пикселей из файла изображения в .NET - PullRequest
2 голосов
/ 10 марта 2010

Я пытаюсь прочитать данные пикселей из файла изображения как byte[] для хранения в памяти. (Массив байтов будет позже передан объекту растрового изображения, но я хочу, чтобы данные были в памяти, чтобы не было задержек ввода / вывода.)

Вот что я сейчас делаю:

private byte[] GetImageBytes(Uri imageUri) {

     //arraySize and stride previously defined

    var pixelArray = new byte[arraySize];
    new BitmapImage(imageUri).CopyPixels(pixelArray , stride, 0);

    return pixelArray ;
}

Мне интересно, знает ли кто-нибудь способ получения данных byte[], кроме создания BitmapImage и последующего копирования всех байтов. То есть Есть ли класс .NET, который будет просто передавать данные пикселей из файла? (Первоначально я использовал File.ReadAllBytes, но это вносило другие вещи, такие как метаданные изображения, и не получалось.)

Ответы [ 4 ]

0 голосов
/ 02 сентября 2015

В .NET 4.5 фактически работает следующее:

ImageConverter ic = new ImageConverter(); 
return (byte[])ic.ConvertTo(imageUri, typeof(byte[]));

Моя фактическая реализация была:

Image img;
img = Image.FromFile(fi.FullName);
ImageConverter ic = new ImageConverter();
byte[] pixels = (byte[])ic.ConvertTo(img, typeof(byte[]));
0 голосов
/ 11 марта 2010

Рассматривали ли вы просто загрузку своего изображения в CachedBitmap вместо использования собственного механизма кэширования?

http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.cachedbitmap.aspx

0 голосов
/ 16 сентября 2010

Я отвечу на свой вопрос, если кто-то еще посчитает его полезным:

Причина, по которой я изначально хотел прочитать данные в байтовый массив, заключалась в том, что я мог выполнять файловый или сетевой ввод-вывод в фоновом потоке. Но с тех пор я узнал о методе Freeze(), который позволяет читать изображение в фоновом потоке, а затем делиться между потоками.

Поэтому, если я замораживаю BitmapImage, импульс для временного хранения данных в byte[] исчезает, и проблема решается.

0 голосов
/ 10 марта 2010

Играли ли вы с классом ImageConverter в System.Drawing?

Возможно, вы сможете сделать что-то вроде

private byte[] GetImageBytes(Uri imageUri) 
{
    ImageConverter ic = new ImageConverter();
    return (byte[])ic.ConvertTo(imageUri, typeof(byte[]));
}

Могут быть некоторые методы, относящиеся к копированию пикселей в классе ImageConverter или аналогичном классе в System.Drawing

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...