C# WriteableBitmap.SaveJpeg
代码中的wb.SaveJpeg行生成错误:System.Windows.Media.Imaging.WriteableBitmap'不包含“SaveJpeg”的定义,并且找不到接受类型为“System.Windows.Media.Imaging.WriteableBitmap”的第一个参数的扩展方法“SaveJpeg” 我把PresentationCore、PresentationFramework、System.Windows.Forms和WindowsBase作为参考C# WriteableBitmap.SaveJpeg,c#,c#-4.0,jpeg,C#,C# 4.0,Jpeg,代码中的wb.SaveJpeg行生成错误:System.Windows.Media.Imaging.WriteableBitmap'不包含“SaveJpeg”的定义,并且找不到接受类型为“System.Windows.Media.Imaging.WriteableBitmap”的第一个参数的扩展方法“SaveJpeg” 我把PresentationCore、PresentationFramework、System.Windows.Forms和WindowsBase作为参考 BitmapImage
BitmapImage image = CaptureImageFromClipBoard();
WriteableBitmap wb = new WriteableBitmap(image);
using (var isf = IsolatedStorageFile.GetUserStoreForApplication())
{
using (var fs = isf.CreateFile(path + "\\" + filename + ".jpg"))
{
wb.SaveJpeg(fs, wb.PixelWidth, wb.PixelHeight, 10, 100);
}
}
以下是CaptureImageFromClipBoard的方法:
static public BitmapImage CaptureImageFromClipBoard()
{
var img = new System.Windows.Controls.Image();
var imgsrc = Clipboard.GetImage();
img.Source = new FormatConvertedBitmap(imgsrc, PixelFormats.Bgr32, null, 0);
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
MemoryStream memoryStream = new MemoryStream();
BitmapImage bImg = new BitmapImage();
encoder.Frames.Add(BitmapFrame.Create(imgsrc));
encoder.Save(memoryStream);
bImg.BeginInit();
bImg.StreamSource = new MemoryStream(memoryStream.ToArray());
bImg.EndInit();
memoryStream.Close();
return bImg;
}
我建议这样做-注意:未经测试,从内存和原始帖子中键入
static public void SaveCapturedImageFromClipBoard(Stream target)
{
var img = new System.Windows.Controls.Image();
var imgsrc = Clipboard.GetImage();
img.Source = new FormatConvertedBitmap(imgsrc, PixelFormats.Bgr32, null, 0);
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(imgsrc));
encoder.Save(target);
}
及
为了保存位图,您需要一个BitmapEncoder类。。。就像您在CaptureImageFromClipBoard方法中使用的int一样。可写并不意味着“可保存”-它将允许您在内存中写入位图。我想我在哪里有encoder.Save(memorystream)--我想将其保存到一个物理文件,在它的位置会发生这种情况吗?我所要做的就是把我的图像保存到一个文件中。这是一个糟糕的例子,而且会误导人。img变量的用途是什么?在后面的代码中没有使用它。在我看来,您只需要3行代码——创建编码器、从剪贴板内容添加位图框并保存到目标流。这里的问题是:Clipboard.GetImage方法存在严重缺陷,为了避免获取空白图像,您必须首先将其转换为另一个(临时)图像,或者使用interop实现低级剪贴板功能。我需要再检查一下细节。此外,正如我提到的,它是从内存中输入的,只是对原始帖子的修改。
using (var isf = IsolatedStorageFile.GetUserStoreForApplication())
{
using (var fs = isf.CreateFile(path + "\\" + filename + ".jpg"))
{
SaveCapturedImageFromClipBoard(fs);
}
}