2

根据此处的图像编码示例,我应该能够使用JpegBitmapEncoder对图像进行编码以保存为 jpeg 文件,但会出现此编译错误:

错误 CS1503:参数 1:无法从“System.Windows.Controls.Image”转换为“System.Uri”

我看不到System.Uri从 Image 获取的方法(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)以 30 Fps 将 640 x 480 RBG 流式传输到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);
}
4

3 回答 3

3
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);
    }
}
于 2013-07-09T17:28:46.673 回答
2

出现问题,因为您传递了Imageto BitmapFrame.CreateImage在 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);
        }
    }

加法(见评论中的对话):

您可以尝试CopyPixels在 writeableBitmap 对象上使用该方法并将像素复制到您加载到 a 的字节数组中,MemoryStream然后使用JpegBitmapEncoder. 但这只是一个猜测。

这也可以工作:

     private void SaveImage (WriteableBitmap img, string path)
     {
         FileStream stream = new FileStream(path, FileMode.Create);
         JpegBitmapEncoder encoder = new JpegBitmapEncoder();
         encoder.Frames.Add(BitmapFrame.Create(img));
         encoder.Save(stream);
         stream.Close();
     }

您只需从 Image 控件中提取 WriteableBitmap

于 2013-07-09T13:42:50.950 回答
0

尝试:BitmapFrame.Create(image.Source)

于 2013-07-09T13:42:38.083 回答