WPF:作为 BitmapImage 的 CroppedBitmap 的图像控件仍然是未裁剪图像(转换问题?)

WPF: Image control of a CroppedBitmap as BitmapImage is still uncropped Image (Conversion Problem?)

我正在尝试使用 CroppedBitmap class.

在我的 WPF 应用程序 StageWindow.Stage 中裁剪 BitmapImage

将新裁剪的图像保存到文件时 JpegBitmapEncoder 我可以看到正确裁剪的图像。 CroppedBitmap Crop

但是我实际上想将裁剪后的图像保存到 List\<BitmapImage\> 中以供以后在另一个 WPF 图像控件中使用。该列表已包含 BitmapImages,因此将其更改为 CroppedBitmaps 是不够的。

为了能够存储新的 croppedBitmap,我使用这样的东西:

    BitmapImage xx = CroppedBitmap1 as BitmapImage;

将 WPF 图像控件设置为 new BitmapImage (ExpectedCroppedImage) 时,它仍然显示 CroppedBitmaps 未经裁剪的原始源图像。

我怀疑上面的代码从新的 BitmapImage 中删除了裁剪属性,因为 BitmapImage 本身没有裁剪区域的属性。但是我怎样才能只将裁剪的部分保存到新的 BitmapImage?

我一直在搜索,但似乎 CroppedBitmap 应该可以解决问题我只是不知道如何以正确的方式将其转换回来。

这里是澄清代码:

    //Stage is the WPF image element that im reading the source image from.
    
    ImageSource StageWindowImageSource = StageWindow.Stage.Source;
    CroppedBitmap Crop = new CroppedBitmap((BitmapSource)StageWindowImageSource, new Int32Rect(0,0,50,50));
        
    ExpectedCroppedImage = Crop.Source as BitmapImage;
                            
    JpegBitmapEncoder jpg = new JpegBitmapEncoder();
    jpg.Frames.Add(BitmapFrame.Create(Crop));
    FileStream fp = new FileStream("F:/Crop.jpg", FileMode.Create, FileAccess.Write);
    jpg.Save(fp);
    fp.Close();

private void MyMethod()
{
    ImageSource   StageWindowImageSource = img.Source;
    CroppedBitmap Crop                   = new CroppedBitmap((BitmapSource) StageWindowImageSource, new Int32Rect(20, 20, 150, 110));

    img2.Source = GetImage(Crop, new JpegBitmapEncoder());
}

private BitmapImage GetImage(BitmapSource source, BitmapEncoder encoder)
{
    var image = new BitmapImage();

    using (var sourceMs = new MemoryStream())
    {
        encoder.Frames.Add(BitmapFrame.Create(source));
        encoder.Save(sourceMs);

        sourceMs.Position = 0;
        using (var destMs = new MemoryStream(sourceMs.ToArray()))
        {
            image.BeginInit();
            image.StreamSource = destMs;
            image.CacheOption  = BitmapCacheOption.OnLoad;
            image.EndInit();
            image.Freeze();
        }
    }

    return image;
}

ExpectedCroppedImage = Crop.Source as BitmapImage;

不是 return 裁剪位图,而是裁剪后的原始位图,即 Source 位图。

除此之外,您不需要从 CroppedBitmapBitmapImage 的任何转换。

相反,使用 BitmapImage 和 CroppedBitmap 的基础 class 作为列表的元素类型,即使用 List<BitmapSource>List<ImageSource> 作为您的集合。

现在您可以分配从元素类型派生的任何 class 的实例。

List<BitmapSource> images = ...

CroppedBitmap croppedImage = new CroppedBitmap(...); 
images.Add(croppedImage);

BitmapImage someOtherImage = new BitmapImage(...); 
images.Add(someOtherImage);