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】:

您需要使用 PixelWidthPixelHeight 属性,如果您看不到它们(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 值,以及 的属性 WidthHeight BitmapSourceBitmapImage 派生自 BitmapSource)也是 double 值。我用一些图像测试了代码,它似乎工作...... ;) 我试过了。但我的情况不同。我有一个位图源。 BitmapSource Width 为 1024,PixelWidth 为 1024。现在,图像将被裁剪为 47.3 宽度。在您的示例中,您将值从 Double(47.3) 舍入到 Int(47)

以上是关于wpf CroppedBitmap 将图像裁剪为双精度像素值的主要内容,如果未能解决你的问题,请参考以下文章

从 WPF 中的图像裁剪对角线区域

WPF IrfanView 风格的图像裁剪控件

WPF 图像集边界

裁剪带有顶部和底部边距的图像

如何裁剪部分gif图像?

WPF 图像裁剪