【问题标题】:Corrupted File when I save a Bitmap image on HardDrive当我在硬盘上保存位图图像时文件损坏
【发布时间】:2011-11-21 04:43:12
【问题描述】:

我有一个 Silverlight 浏览器外应用程序,我想将图片保存在指定目录中。在应用程序中,我将图片加载到 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;
} 

问题是我得到的文件不可读(损坏),当我尝试从应用程序中读取它时,我遇到了灾难性故障。我还注意到应用程序生成的文件比原始文件重四倍...

感谢您的帮助!

菲利普

来源:

Can I get a byte[] from a BitmapImage in Silverlight?

Silverlight: image to byte[]

【问题讨论】:

  • 是的,我在两台不同的计算机上遇到了同样的问题。更重要的是,我正在处理大量图片(> 1000)并且它们都已损坏......
  • 图像文件中的像素多于...请参阅stackoverflow.com/questions/4161359/save-bitmapimage-to-file 了解应该可以工作的代码。
  • 这个解决方案在 WPF 中应该很好,但它在 Silverlight 中不起作用,因为 JpegBitmapEncoder 不可用...
  • +1 用于提供您的代码。更容易发现问题。

标签: c# silverlight file bitmapimage out-of-browser


【解决方案1】:

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

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

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

【讨论】:

  • 我已经尝试使用 ImageTools 对 jpeg 中的图像进行编码,我得到了 1 个 Ko 图像...事实上我并不需要 JPEG 图像或任何我可以使用图像查看器读取的图像.我只需要能够从我的 silverlight 应用程序中读取它。如果我只是将所有字节写入原始文件,然后将它们读回并将它们放入新的 BitmapImage (BitmapImage.SetSource),您不认为它应该工作吗?我也怕可能内存不足……
  • 如果您还写出重建原始字节所需的其他信息(图像尺寸等),则读取和写入原始字节将起作用,但这是一种非常低效的存储方式。加载后内存要求相同。
  • 我终于通过.Net Image 工具中的 jpegencoder 解决了 1ko 图像问题...感谢您的建议!
猜你喜欢
  • 2020-06-09
  • 2011-02-08
  • 1970-01-01
  • 2015-08-13
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2023-03-19
相关资源
最近更新 更多