Windows 8 WinRT中的裁剪/剪辑图像

Windows 8 WinRT中的裁剪/剪辑图像,windows-8,windows-runtime,writablebitmap,Windows 8,Windows Runtime,Writablebitmap,如何在WinRT中裁剪/剪辑图像。我有一个完全填充在Windows8窗口中的图像。我需要从中心剪辑/裁剪图像,并且我需要将两个图像部分显示到两个单独的网格中。如何通过Windows8实现同样的功能。是否可以在不使用WritableBitmapEx的情况下实现此功能。如果否,如何通过WritableBitmapEx执行相同操作。您可以使用Bitmapdecoder和BitmapTransform类。这对种植很有好处。你也应该阅读剪辑。基本上,您实现了这样一个函数(取自示例): async公共静态任

如何在WinRT中裁剪/剪辑图像。我有一个完全填充在Windows8窗口中的图像。我需要从中心剪辑/裁剪图像,并且我需要将两个图像部分显示到两个单独的网格中。如何通过Windows8实现同样的功能。是否可以在不使用WritableBitmapEx的情况下实现此功能。如果否,如何通过WritableBitmapEx执行相同操作。

您可以使用Bitmapdecoder和BitmapTransform类。这对种植很有好处。你也应该阅读剪辑。基本上,您实现了这样一个函数(取自示例):

async公共静态任务GetCroppedBitmapAsync(存储文件原始文件、点起始点、大小合并、双比例)
{ 
if(双精度IsNaN(刻度)|双精度IsInfinity(刻度))
{ 
比例=1;
} 
//将起点和大小转换为整数。
uint起始点X=(uint)数学地板(起始点X*比例);
uint起始点=(uint)数学地板(起始点Y*比例);
单位高度=(单位)数学楼层(单位高度*比例);
单位宽度=(单位)数学地板(单位宽度*比例);
使用(irandomaccesstream=await originalImgFile.OpenReadAsync())
{ 
//从流中创建解码器。使用解码器,我们可以
//图像的属性。
BitmapDecoder decoder=等待BitmapDecoder.CreateAsync(流);
//原始图像的缩放大小。
uint scaledWidth=(uint)数学地板(decoder.PixelWidth*scale);
uint scaledHeight=(uint)数学地板(decoder.PixelHeight*比例);
//优化起点和大小。
如果(起点X+宽度>缩放宽度)
{ 
startPointX=缩放宽度-宽度;
} 
如果(起点+高度>缩放高度)
{ 
起始点=缩放高度-高度;
} 
//创建裁剪位图变换并定义边界。
BitmapTransform=新的BitmapTransform();
BitmapBounds bounds=新的BitmapBounds();
bounds.X=起始点X;
边界Y=起始点Y;
高度=高度;
宽度=宽度;
transform.Bounds=边界;
transform.ScaledWidth=ScaledWidth;
transform.ScaledHeight=ScaledHeight;
//获取变换范围内的裁剪像素。
PixelDataProvider pix=等待解码器。GetPixelDataAsync(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode。笔直,
使改变
ExifOrientationMode.IGNOREEXIFORIENTION,
ColorManagementMode.ColorManagementOSRGB);
字节[]像素=pix.DetachPixelData();
//将字节流式传输到可写Bitmap中
WriteableBitmap cropBmp=新的WriteableBitmap((int)宽度,(int)高度);
Stream pixStream=cropBmp.PixelBuffer.AsStream();
pixStream.Write(像素,0,(int)(宽度*高度*4));
返回cropBmp;
} 
} 

您可以使用Bitmapdecoder和BitmapTransform类。这对种植很有好处。你也应该阅读剪辑。基本上,您实现了这样一个函数(取自示例):

async公共静态任务GetCroppedBitmapAsync(存储文件原始文件、点起始点、大小合并、双比例)
{ 
if(双精度IsNaN(刻度)|双精度IsInfinity(刻度))
{ 
比例=1;
} 
//将起点和大小转换为整数。
uint起始点X=(uint)数学地板(起始点X*比例);
uint起始点=(uint)数学地板(起始点Y*比例);
单位高度=(单位)数学楼层(单位高度*比例);
单位宽度=(单位)数学地板(单位宽度*比例);
使用(irandomaccesstream=await originalImgFile.OpenReadAsync())
{ 
//从流中创建解码器。使用解码器,我们可以
//图像的属性。
BitmapDecoder decoder=等待BitmapDecoder.CreateAsync(流);
//原始图像的缩放大小。
uint scaledWidth=(uint)数学地板(decoder.PixelWidth*scale);
uint scaledHeight=(uint)数学地板(decoder.PixelHeight*比例);
//优化起点和大小。
如果(起点X+宽度>缩放宽度)
{ 
startPointX=缩放宽度-宽度;
} 
如果(起点+高度>缩放高度)
{ 
起始点=缩放高度-高度;
} 
//创建裁剪位图变换并定义边界。
BitmapTransform=新的BitmapTransform();
BitmapBounds bounds=新的BitmapBounds();
bounds.X=起始点X;
边界Y=起始点Y;
高度=高度;
宽度=宽度;
transform.Bounds=边界;
transform.ScaledWidth=ScaledWidth;
transform.ScaledHeight=ScaledHeight;
//获取变换范围内的裁剪像素。
PixelDataProvider pix=等待解码器。GetPixelDataAsync(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode。笔直,
使改变
ExifOrientationMode.IGNOREEXIFORIENTION,
ColorManagementMode.ColorManagementOSRGB);
字节[]像素=pix.DetachPixelData();
//将字节流式传输到可写Bitmap中
WriteableBitmap cropBmp=新的WriteableBitmap((int)宽度,(int)高度);
Stream pixStream=cropBmp.PixelBuffer.AsStream();
pixStream.Write(像素,0,(int)(宽度*高度*4));
返回cropBmp;
} 
} 

XAML静态方式,如果我的屏幕大小是1366x768&我想剪辑中心400x300图像,那么我会这样做

<Image Source="Assets/img100.png" Stretch="Fill">
    <Image.Clip>
        <RectangleGeometry Rect="483,234,400,300" />
    </Image.Clip>
</Image>
别忘了结账


XAML静态方式,如果我的屏幕大小是1366x768&我想剪辑中心400x300图像,那么我会这样做

<Image Source="Assets/img100.png" Stretch="Fill">
    <Image.Clip>
        <RectangleGeometry Rect="483,234,400,300" />
    </Image.Clip>
</Image>
别忘了结账


实际上有很多方法可以做到这一点,每种方法都有一些优点和缺点

  • WriteableBitmapEx
    似乎是一种流行的解决方案。我在中有一个类似的实现。两者本质上都是从完整图像位图复制像素块。这可能不是最快的方法,但是如果你想得到一个开箱即用的解决方案,它是一个易于使用的方法。你需要复制pi
    double _Height = 300, _Width = 400;
    img.Clip = new RectangleGeometry 
    {
        Rect = new Rect((Window.Current.Bounds.Width - _Width) / 2, (Window.Current.Bounds.Height - _Height) / 2, _Width, _Height)
    };