C# WPF:BitmapImage仍然是未裁剪图像时裁剪位图的图像控制(转换问题?)

C# WPF:BitmapImage仍然是未裁剪图像时裁剪位图的图像控制(转换问题?),c#,wpf,type-conversion,crop,bitmapimage,C#,Wpf,Type Conversion,Crop,Bitmapimage,我正在尝试使用CroppedBitmap类在WPF应用程序StageWindow.Stage中裁剪位图图像 将新裁剪的图像保存到文件JpegBitmapEncoder时,我可以看到正确裁剪的图像。裁剪位图裁剪 但是,我实际上希望将裁剪后的图像保存到列表\中,以便以后在另一个WPF图像控件中使用。该列表已包含位图,因此将其更改为裁剪位图是不够的 为了能够存储新裁剪的位图,我使用如下内容: BitmapImage xx = CroppedBitmap1 as BitmapImage; 将W

我正在尝试使用CroppedBitmap类在WPF应用程序StageWindow.Stage中裁剪位图图像

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

但是,我实际上希望将裁剪后的图像保存到列表\中,以便以后在另一个WPF图像控件中使用。该列表已包含位图,因此将其更改为裁剪位图是不够的

为了能够存储新裁剪的位图,我使用如下内容:

    BitmapImage xx = CroppedBitmap1 as BitmapImage;
将WPF图像控件设置为新位图图像ExpectedCroppedImage时,它仍会显示不带裁剪的裁剪位图原始源图像

我怀疑上面的代码会从新位图图像中删除裁剪属性,因为位图图像本身没有裁剪区域的属性。但是,如何仅将剪切的部分保存到新的位图图像中

我一直在四处搜索,但它似乎裁剪位图应该做的技巧,我只是不知道如何转换回正确的方式

以下是澄清代码:

    //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();

线路

ExpectedCroppedImage = Crop.Source as BitmapImage;
不返回裁剪后的位图,而是从中进行裁剪的原始位图,即源位图

除此之外,您不需要从CroppedBitmap到BitmapImage进行任何转换

相反,请使用BitmapImage和CroppedBitmap的基类作为列表的元素类型,即为集合使用一个或多个列表

现在可以指定从元素类型派生的任何类的实例

List<BitmapSource> images = ...

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

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

这种转换是完全多余的。img2.来源=作物;虽然这并没有给我想要的位图图像,但它仍然是我的项目最简单的解决方案,所以我把它标记为正确答案。我还在想为什么裁剪的位图源仍然比实际需要的更多。这不是有点浪费内存吗?我想这是可以忽略的…在WPF中裁剪位图最简单的方法是使用裁剪位图。对于所需的位图图像,实际上并不需要它。可以将任何其他ImageSource指定给图像元素的Source属性。
List<BitmapSource> images = ...

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

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