Поврежденный файл при сохранении растрового изображения на жестком диске - PullRequest
1 голос
/ 21 ноября 2011

У меня есть приложение Silverlight вне браузера, и я хочу сохранить изображения в указанном каталоге. В приложении у меня есть изображение, загруженное в BitmapImage, и я хочу сохранить его на HardDrive (в jpg, если это возможно). Мой код:

private void SaveImageToImagePath(BitmapImage image)
{
    string path = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Images");
    if (!Directory.Exists(path))
    {
        Directory.CreateDirectory(path);
    }

    Save(image, new FileStream(Path.Combine(path, String.Format("{0}.jpg", _imageName)), FileMode.OpenOrCreate));
}

private void Save(BitmapSource bitmapSource, FileStream stream)
{
    var writeableBitmap = new WriteableBitmap(bitmapSource);

    for (int i = 0; i < writeableBitmap.Pixels.Length; i++)
    {
        int pixel = writeableBitmap.Pixels[i];

        byte[] bytes = BitConverter.GetBytes(pixel);
        Array.Reverse(bytes);

        stream.Write(bytes, 0, bytes.Length);
    }
} 

Я также пытался с помощью этого метода перейти от BitmapImage к ByteArray:

private byte[] ToByteArray(WriteableBitmap bmp)
{
    // Init buffer 
    int w = bmp.PixelWidth;
    int h = bmp.PixelHeight;
    int[] p = bmp.Pixels;
    int len = p.Length;
    byte[] result = new byte[4 * w * h];

    // Copy pixels to buffer 
    for (int i = 0, j = 0; i < len; i++, j += 4)
    {
        int color = p[i];
        result[j + 0] = (byte)(color >> 24); // A 
        result[j + 1] = (byte)(color >> 16); // R 
        result[j + 2] = (byte)(color >> 8);  // G 
        result[j + 3] = (byte)(color);       // B 
    }

    return result;
} 

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

Спасибо за вашу помощь!

Philippe

Источники:

Можно ли получить байт [] из BitmapImage в Silverlight?

Silverlight: изображение в байтах []

1 Ответ

1 голос
/ 21 ноября 2011

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

Это не просто набор значений RGB, но вы просто записываете пиксельные байтовые значения в файл. То, что вы пишете, это в основном RAW файл изображения . Если вы загрузите фото инструмент, который читает файлы изображений RAW (и укажете размер), вы сможете просмотреть его, но это не та проблема, которую вы пытаетесь решить.

Лучше всего в Silverlight сохранять их в PNG-файлы, используя PNGEncoder или, может быть, .Net Image Tools , иначе вам потребуется найти другую пользовательскую библиотеку, которая может дублировать JPG. сжатие / сохранение.

...