C# 在硬盘上保存位图图像时文件已损坏

C# 在硬盘上保存位图图像时文件已损坏,c#,silverlight,file,bitmapimage,out-of-browser,C#,Silverlight,File,Bitmapimage,Out Of Browser,我有一个Silverlight浏览器外应用程序,我想将图片保存在指定目录中。在应用程序中,我已将图片加载到位图图像中,并希望将其保存在硬盘上(如果可能,请使用jpg)。我的代码: private void SaveImageToImagePath(BitmapImage image) { string path = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)

我有一个Silverlight浏览器外应用程序,我想将图片保存在指定目录中。在应用程序中,我已将图片加载到位图图像中,并希望将其保存在硬盘上(如果可能,请使用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);
    }
} 
private void SaveImageToImagePath(位图图像)
{
string path=System.IO.path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),“图像”);
如果(!Directory.Exists(path))
{
CreateDirectory(路径);
}
保存(image,新文件流(Path.Combine(Path,String.Format(“{0}.jpg”,_imageName)),FileMode.OpenOrCreate));
}
私有void保存(BitmapSource BitmapSource、FileStream流)
{
var writeableBitmap=新的writeableBitmap(位图源);
对于(int i=0;i
我还尝试使用此方法将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;
} 
private byte[]ToByteArray(WriteableBitmap bmp)
{
//初始化缓冲区
int w=bmp.PixelWidth;
int h=bmp.PixelHeight;
int[]p=bmp.像素;
int len=p.长度;
字节[]结果=新字节[4*w*h];
//将像素复制到缓冲区
对于(int i=0,j=0;i>24);//A
结果[j+1]=(字节)(颜色>>16);//R
结果[j+2]=(字节)(颜色>>8);//G
结果[j+3]=(字节)(颜色);//B
}
返回结果;
} 
问题是,我获取的文件不可读(已损坏),当我尝试从应用程序读取它时,我遇到了灾难性的失败。我还注意到应用程序生成的文件比原始文件重四倍

谢谢你的帮助

菲利普

资料来源:


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

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


您在Silverlight中的最佳选择是使用或将其保存到PNG文件,否则您将需要找到另一个可以复制JPG压缩/保存的自定义库。

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

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


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

是的,我在两台不同的计算机上遇到了相同的问题。更重要的是,我正在处理大量图片(>1000),它们都已损坏…图像文件中的像素数超过了。。。请参阅,了解应该可以工作的代码。此解决方案在WPF中应该很好,但在Silverlight中不起作用,因为JpegBitmapEncoder不可用…+1提供您的代码。使发现问题更容易。是的,我在两台不同的计算机上遇到了相同的问题。更重要的是,我正在处理大量图片(>1000),它们都已损坏…图像文件中的像素数超过了。。。请参阅,了解应该可以工作的代码。此解决方案在WPF中应该很好,但在Silverlight中不起作用,因为JpegBitmapEncoder不可用…+1提供您的代码。使发现问题变得更容易。我已经尝试用ImageTools对图像进行jpeg编码,得到了1KO图像。。。事实上,我并不需要JPEG图像,也不需要任何可以用图像查看器阅读的图像。我只需要能够从silverlight应用程序中读取它。如果我只是将所有字节写入一个原始文件,然后将它们读回,并将它们放入一个新的BitmapImage(BitmapImage.SetSource)中,难道你不认为应该这样做吗。我还担心内存可能不足……如果您还写出重建原始字节所需的其他信息(图像尺寸等),那么读取和写入原始字节将起作用,但这是一种非常低效的存储方式。内存需求在加载后是相同的。我最终通过解决1ko图像问题,在.Net图像工具中使用JPEG编码器获得了它。。。谢谢你的建议!我已经尝试用ImageTools对图像进行jpeg编码,得到了1KO图像。。。事实上,我并不需要JPEG图像,也不需要任何可以用图像查看器阅读的图像。我只需要能够从silverlight应用程序中读取它。如果我只是将所有字节写入一个原始文件,然后将它们读回,并将它们放入一个新的BitmapImage(BitmapImage.SetSource)中,难道你不认为应该这样做吗。我还担心内存可能不足……如果您还写出重建原始字节所需的其他信息(图像尺寸等),那么读取和写入原始字节将起作用,但这是一种非常低效的存储方式。内存需求在加载后是相同的。我最终通过解决1ko图像问题,在.Net图像工具中使用JPEG编码器获得了它。。。谢谢你的建议!