wpf CroppedBitmap 将图像裁剪为双精度像素值
Posted
技术标签:
【中文标题】wpf CroppedBitmap 将图像裁剪为双精度像素值【英文标题】:wpf CroppedBitmap crop image as pixel values in double 【发布时间】:2013-01-08 12:20:22 【问题描述】:我正在使用 WPF 中的 CroppedBitmap 方法裁剪图像。 必需的输入参数是 int32Rect。 但是,我的图像高度和宽度值是双倍(像素)。 因此,如果不将 Double 截断为 Int,我想通过使用 double 值(像素)来裁剪图像
【问题讨论】:
像素是整数单位。小数像素有什么意义? 【参考方案1】:您需要使用 PixelWidth 和 PixelHeight 属性,如果您看不到它们(Intellisense 找不到它们),您可以使用 as 运算符将其转换为 BitmapSource。例如:
BitmapSource src = yourImage as BitmapSource;
CroppedBitmap chunk = new CroppedBitmap(src, new Int32Rect(src.PixelWidth / 4, src.PixelHeight / 4, src.PixelWidth / 2, src.PixelHeight / 2));
顺便说一下,如果无法执行转换,as 运算符会返回 null(因此您可能需要检查 src
是否不是 null
之后上面示例中的转换,除非您确定 yourImage
是从 BitmapSource 派生的)。
编辑:
我不确定这是否是您需要的,但这里有一个接受 Rect(浮点值)作为输入并返回 CroppedBitmap 的方法:
public static CroppedBitmap GetCroppedBitmap(BitmapSource src, Rect r)
double factorX, factorY;
factorX = src.PixelWidth / src.Width;
factorY = src.PixelHeight / src.Height;
return new CroppedBitmap(src, new Int32Rect((int)Math.Round(r.X * factorX), (int)Math.Round(r.Y * factorY), (int)Math.Round(r.Width * factorX), (int)Math.Round(r.Height * factorY)));
例子:
BitmapImage bmp = new BitmapImage(new Uri(@"c:\Users\Public\Pictures\Sample Pictures\Koala.jpg", UriKind.Relative));
CroppedBitmap chunk = GetCroppedBitmap(bmp, new Rect(bmp.Width / 4, bmp.Height / 4, bmp.Width / 2, bmp.Height / 2));
JpegBitmapEncoder jpg = new JpegBitmapEncoder();
jpg.Frames.Add(BitmapFrame.Create(chunk));
FileStream fp = new FileStream("chunk.jpg", FileMode.Create, FileAccess.Write);
jpg.Save(fp);
fp.Close();
【讨论】:
您仍在将值转换为 Int32Rect。但我想提供双 DataType 值。例如:X = 450.56,Y = 331.35,宽度 = 35.46,高度 = 91.69。我想使用这些值裁剪图像。 您正在使用 Rect 裁剪图像。 Rect 将支持宽度作为 Int 数据类型。但我需要将宽度值作为双数据类型传递。例如:35.46 像素。 @Lakshmanan 所以你甚至没有测试代码...Rect 存储 double 值,以及 的属性Width
和 Height
BitmapSource(BitmapImage 派生自 BitmapSource)也是 double 值。我用一些图像测试了代码,它似乎工作...... ;)
我试过了。但我的情况不同。我有一个位图源。 BitmapSource Width 为 1024,PixelWidth 为 1024。现在,图像将被裁剪为 47.3 宽度。在您的示例中,您将值从 Double(47.3) 舍入到 Int(47)以上是关于wpf CroppedBitmap 将图像裁剪为双精度像素值的主要内容,如果未能解决你的问题,请参考以下文章