2017-01-25 9 views
0

У меня есть простой массив байт, представляющий собой изображение в шкале серого (значение исходить от 0 до 255)Преобразовать массив байтов в формате JPEG в оттенках серого

Там есть пример:

Byte[] sample = new Byte[16] { 
    55 ,0 ,0 ,255, 
    12 ,255,75 ,255, 
    255,150,19 ,255, 
    42 ,255,78 ,255 }; 

Я хочу, чтобы сохранить это в формате jpeg, но я не знаю, как это сделать.

Я попробовал 2 способа, но он не работает. Я думаю, что мой массив байтов не правильно отформатирован, но я не знаю, как это сделать.

Я попытался это:

TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); 
Bitmap bmp = (Bitmap)tc.ConvertFrom(sample); 
bmp.Save(myPath, System.Drawing.Imaging.ImageFormat.Jpeg); 

И это:

MemoryStream str = new MemoryStream(sample); 
str.Position = 0; 
using (Image image = Image.FromStream(str)) 
{ 
    image.Save(myPath, System.Drawing.Imaging.ImageFormat.Jpeg); 
} 
+0

Вы уверены, что это действительные данные JPEG? Ваше использование потока похоже на то, что он должен делать то, что вы хотите, если эти данные являются данными JPEG. –

+0

Данные не являются самим файлом изображения, а массивом пиксельных данных, поэтому вы должны создать растровое изображение, установить пиксели в цвета, которые у вас есть (с помощью SetPixel или LockBits), а затем сохранить растровое изображение как jpeg. – Gusman

+0

Я ожидаю, что где-то вам нужно сообщить своей библиотеке, что ваши данные в оттенках серого (то есть один компонент). – user3344003

ответ

1

Со всеми вашими показаниями, я, наконец, найти способ:

public static void SaveByteArryToJpeg(string imagePath, Byte[] data, int width, int height) 
{ 
    if (width * height != data.Length) 
     throw new FormatException("Size does not match"); 

    Bitmap bmp = new Bitmap(width, height); 

    for (int r = 0; r < height; r++) 
    { 
     for (int c = 0; c < width; c++) 
     { 
      Byte value = data[r * width + c]; 
      bmp.SetPixel(c, r, Color.FromArgb(value, value, value)); 
     } 
    } 

    bmp.Save(imagePath, System.Drawing.Imaging.ImageFormat.Jpeg); 
} 
+1

Рад, что у вас это работает :) Будьте уверены, что SetPixel очень медленный, если вы хотите, чтобы быстрое преобразование проверило документацию для LockBits, оно заблокирует данные изображения растрового изображения как указатель, чтобы вы могли напрямую назначить данные, просто скопировав массив. – Gusman

+0

Мне, вероятно, придется работать на многих изображениях, я посмотрю. спасибо –

1
BitmapImage photo = byteToImage(byte[] sample) 

это functionto новообращенный байт BitmapImage

public BitmapImage byteToImage(byte[] buffer) 
{ 

using(var ms = new MemoryStream(buffer)) 
{ 
    var image = new BitmapImage(); 
    image.BeginInit(); 
    image.CacheOption = BitmapCacheOption.OnLoad; 
    image.StreamSource = ms; 
    image.EndInit(); 
} 

return image; 
} 

, а затем byteToImage возвратит изображение, поэтому y ou может сэкономить.

Надеемся, что это может помочь вам

+0

Я пробовал это, но когда я выполняю 'image.EndInit();', получено NotSupportedException: «Не удалось найти компонент обработки изображений, подходящий для завершения этой операции». –

 Смежные вопросы

  • Нет связанных вопросов^_^