提取子图像BitmapImage

时间:2015-02-17 15:24:18

标签: c# image extract bitmapimage win-universal-app

我正在开发一个需要我显示大量图像的C#Universal Project(Windows桌面+ Windows Phone)。我正在尝试使用我已经给出的“压缩”图像。

这是图片:http://gyazo.com/b592a5fb6b4754c0aecc0223be56a3cf

图像由子图像组成,这些子图像全部放入1个图像中以节省空间。在过去,我编写了C#Desktop应用程序,并使用以下代码从包含子图像的图像中提取图像。

public Bitmap Load(int x, int y, int w, int h, string sprite)
{
    Bitmap original = new Bitmap(@"Images\" + sprite);
    Rectangle rectangle = new Rectangle(x, y, w, h);
    return (Bitmap)original.Clone(rectangle, original.PixelFormat);
}

现在我正在使用通用应用程序(桌面+电话),上述代码不再有效。我被迫使用BitmapImages而不是Bitmap。

我试图转换它:

public BitmapImage Load(double x, double y, double w, double h, string sprite)
{
    BitmapImage original = new BitmapImage();
    original.UriSource = new Uri(@"Images\" + sprite);
    Rectangle rectangle = new Rectangle();
    rectangle.Width = w;
    rectangle.Height = h;
    rectangle.RadiusX = x;
    rectangle.RadiusY = y;
    return (BitmapImage)original.clone(rectangle, original.PixelFormat);
}

但BitmapImages不存在.clone和.PixelFormat函数。 任何有关将此代码转换为在C#Universal App中工作的帮助都将非常感谢!

1 个答案:

答案 0 :(得分:2)

您无法从BitmapImage中提取像素。您需要使用WriteableBitmap或BitmapDecoder来访问实际像素。

使用BitmapDecoder,您可以使用GetPixelDataAsync调用BitmapTransform只读取您要从位图中裁剪的边界来读取图像的特定部分。

使用WriteableBitmap或BitmapEncoder,您可以读取完整的位图,然后在事实之后提取子图像。没有内置任何内容来复制子图像,但是查找和复制矩形的数学并不困难并且存在第三方扩展(例如WriteableBitmapEx' s作物延伸方法)可以为你做。