当我在硬盘上保存位图图像时损坏的文件

本文关键字:图像 损坏 文件 位图 保存 硬盘 | 更新日期: 2023-09-27 18:15:20

我有一个Silverlight Out-of-browser应用程序,我想把图片保存在指定的目录上。在应用程序中,我将图片加载为BitmapImage,并希望将其保存在硬盘上(如果可能的话,以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: image to byte[]

当我在硬盘上保存位图图像时损坏的文件

JPG文件是一组复杂的压缩数据,经过优化可以为逼真的图像提供最佳压缩。它通过识别整个图像中方形区域的颜色模式并消除冗余来实现这一点。

它不仅仅是一组RGB值,而是简单地将像素字节值写入文件。你写的基本上是一个RAW图像文件。如果您加载了一个读取RAW图像文件的照片工具(并指定了大小),您将能够查看它,但这不是您要解决的问题。

你在Silverlight中最好的选择是使用PNGEncoder或。net Image Tools将它们保存为PNG文件,否则你将需要找到另一个可以复制JPG压缩/保存的自定义库。