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
位图。
除此之外,您不需要从 CroppedBitmap
到 BitmapImage
的任何转换。
相反,使用 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);
我正在尝试使用 CroppedBitmap
class.
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
位图。
除此之外,您不需要从 CroppedBitmap
到 BitmapImage
的任何转换。
相反,使用 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);