Silverlight 如何复制WriteableBitmap的某些部分?

Silverlight 如何复制WriteableBitmap的某些部分?,silverlight,Silverlight,我有一些可写的位图对象。 假设WriteableBitmap对象上的实际图像为600x400 我想复制图像的一部分——一些矩形(例如,在Wreababl位图中间的100x100的矩形),并将副本粘贴到其他图像控件。 我怎么做 我想你现在已经修好了,但我也遇到了同样的问题,我找到了答案,所以我想我应该把它贴出来。上的代码有一个“裁剪”例程,它几乎完成了您想要的内容。将SizeOfArgb常量设置为4后,可以使用以下方法: public static WriteableBitmap Crop(thi

我有一些可写的位图对象。 假设WriteableBitmap对象上的实际图像为600x400

我想复制图像的一部分——一些矩形(例如,在Wreababl位图中间的100x100的矩形),并将副本粘贴到其他图像控件。


我怎么做

我想你现在已经修好了,但我也遇到了同样的问题,我找到了答案,所以我想我应该把它贴出来。上的代码有一个“裁剪”例程,它几乎完成了您想要的内容。将SizeOfArgb常量设置为4后,可以使用以下方法:

public static WriteableBitmap Crop(this WriteableBitmap bmp, int x, int y, int width, int height)
      {
         var srcWidth = bmp.PixelWidth;
         var srcHeight = bmp.PixelHeight;

         // If the rectangle is completly out of the bitmap
         if (x > srcWidth || y > srcHeight)
         {
            return new WriteableBitmap(0, 0);
         }

         // Clamp to boundaries
         if (x < 0) x = 0;
         if (x + width > srcWidth) width = srcWidth - x;
         if (y < 0) y = 0;
         if (y + height > srcHeight) height = srcHeight - y;

         // Copy the pixels line by line using fast BlockCopy
         var result = new WriteableBitmap(width, height);
         for (var line = 0; line < height; line++)
         {
            var srcOff = ((y + line) * srcWidth + x) * SizeOfArgb;
            var dstOff = line * width * SizeOfArgb;
            Buffer.BlockCopy(bmp.Pixels, srcOff, result.Pixels, dstOff, width * SizeOfArgb);
         }
         return result;
      }
public静态WriteableBitmap裁剪(此WriteableBitmap bmp,int x,int y,int width,int height)
{
var srcWidth=bmp.PixelWidth;
var srchheight=bmp.PixelHeight;
//如果矩形完全超出位图
如果(x>srcWidth | | y>srcHeight)
{
返回新的WriteableBitmap(0,0);
}
//夹住边界
如果(x<0)x=0;
如果(x+width>srcWidth)width=srcWidth-x;
如果(y<0)y=0;
如果(y+height>srcHeight)height=srcHeight-y;
//使用快速区块复制逐行复制像素
var result=新的WriteableBitmap(宽度、高度);
用于(变量行=0;行<高度;行++)
{
var srcOff=((y+行)*srcWidth+x)*SizeOfArgb;
var dstOff=线条*宽度*大小FARGB;
块拷贝(bmp.Pixels,srcloff,result.Pixels,dstOff,width*SizeOfArgb);
}
返回结果;
}

我认为上面的代码不起作用。我无法让它工作,因为它只是返回了原始的bmp图像未剪切。SizeOfArgb是多少?正如我提到的,它是4。
    public static BitmapSource Crop(this BitmapSource bmp, Int32Rect rect)
    {
        return new CroppedBitmap(bmp, rect);
    }