0

我在 WPF 中使用 CroppedBitmap 方法裁剪图像。必需的输入参数是 int32Rect。但是,我的图像高度和宽度值是双倍(像素)。因此,如果不将 Double 截断为 Int,我想通过使用 double 值(像素)来裁剪图像

4

1 回答 1

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运算符将返回nullsrc (因此您可能需要检查上述示例中的转换是否不在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();
于 2013-01-08T19:37:19.693 回答