【发布时间】: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;
}
问题是我得到的文件不可读(损坏),当我尝试从应用程序中读取它时,我遇到了灾难性故障。我还注意到应用程序生成的文件比原始文件重四倍...
感谢您的帮助!
菲利普
来源:
【问题讨论】:
-
是的,我在两台不同的计算机上遇到了同样的问题。更重要的是,我正在处理大量图片(> 1000)并且它们都已损坏......
-
图像文件中的像素多于...请参阅stackoverflow.com/questions/4161359/save-bitmapimage-to-file 了解应该可以工作的代码。
-
这个解决方案在 WPF 中应该很好,但它在 Silverlight 中不起作用,因为 JpegBitmapEncoder 不可用...
-
+1 用于提供您的代码。更容易发现问题。
标签: c# silverlight file bitmapimage out-of-browser