根据图像编码示例here我应该可以使用JpegBitmapEncoder对图像进行编码以保存为jpeg文件但是会出现编译错误:
错误CS1503:参数1:无法从“System.Windows.Controls.Image”转换为“System.Uri”
我没有看到从Image获取System.Uri
的方法(图片中的属性或方法)。
我错过了什么?
Image xaml代码是
<Image Name="ColorImage"/>
SaveImage C#是
...
SaveImage(ColorImage, path);
...
private void SaveImage(Image image, string path)
{
var jpegEncoder = new JpegBitmapEncoder();
jpegEncoder.Frames.Add(BitmapFrame.Create(image));
using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
jpegEncoder.Save(fs);
}
}
下面的代码(主要来自kinect-sdk)将流量640 x 480 RBG传输到30 {30的WriteableBitmap(kinect ColorImageFormat为RgbResolution640x480Fps30)。
using (var colorImageFrame = allFramesReadyEventArgs.OpenColorImageFrame())
{
if (colorImageFrame == null) return;
var haveNewFormat = currentColorImageFormat != colorImageFrame.Format;
if (haveNewFormat)
{
currentColorImageFormat = colorImageFrame.Format;
colorImageData = new byte[colorImageFrame.PixelDataLength];
colorImageWritableBitmap = new WriteableBitmap(
colorImageFrame.Width,
colorImageFrame.Height, 96, 96, PixelFormats.Bgr32, null);
ColorImage.Source = colorImageWritableBitmap;
}
// Make a copy of the color frame for displaying.
colorImageFrame.CopyPixelDataTo(colorImageData);
colorImageWritableBitmap.WritePixels(
new Int32Rect(0, 0, colorImageFrame.Width, colorImageFrame.Height),
colorImageData,
colorImageFrame.Width*Bgr32BytesPerPixel,
0);
}
答案 0 :(得分:2)
出现问题,因为您将Image
传递给BitmapFrame.Create
。 Image
在Windows窗体中更常见。一个简单的方法是首先创建一个MemoryStream
并传递它:
private void SaveImage(Image image, string path)
{
MemoryStream ms = new MemoryStream();
image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
var jpegEncoder = new JpegBitmapEncoder();
jpegEncoder.Frames.Add(BitmapFrame.Create(ms));
using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
jpegEncoder.Save(fs);
}
}
添加(参见评论中的对话):
您可以尝试在writeableBitmap对象上使用CopyPixels
方法,并将像素复制到加载到MemoryStream
的字节数组中,并将其写入Jpeg文件中{{1} }}。但这只是猜测。
这也可行:
JpegBitmapEncoder
您只需要从Image控件中提取WriteableBitmap
答案 1 :(得分:1)
private void SaveImage(string path)
{
var jpegEncoder = new JpegBitmapEncoder();
jpegEncoder.Frames.Add(BitmapFrame.Create(colorImageWritableBitmap));
using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
jpegEncoder.Save(fs);
}
}
答案 2 :(得分:0)
尝试:BitmapFrame.Create(image.Source)