Skip to main content
 首页 » 编程设计

c#之如何使用 JpegBitmapEncoder 保存图像

2024年02月13日35cyq1162

根据图片编码例子here我应该可以使用 JpegBitmapEncoder对图像进行编码以保存为 jpeg 文件但出现此编译错误:

error CS1503: Argument 1: cannot convert from 'System.Windows.Controls.Image' to '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 流式传输到 WriteableBitmap在 30 Fps(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); 
} 

请您参考如下方法:

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); 
    } 
}