繁体   English   中英

为什么在Image上旋转比使用BitmapEncoder快得多?

[英]Why is rotation much faster on Image than using BitmapEncoder?

使用旋转图像

image.RenderTransform = new RotateTransform()...

几乎是立即的。 另一方面,使用

bitmapEncoder.BitmapTransform.Rotation = BitmapRotation.Clockwise90Degrees...

(在FlushAsync()慢得多-超过半秒。

这是为什么? 有没有一种方法可以利用快速旋转来旋转位图?

第一个图像image.RenderTransform将通过使用硬件渲染来渲染位图。 (GPU)图像不旋转,但将显示为旋转/缩放。 (将仅直接从视频内存中/在视频内存中访问可见像素)

第二个将由CPU旋转图像本身(所有像素)。 它将为结果创建新的内存。 (非视频内存)


更新:

有没有一种方法可以使用GPU编辑位图? 取决于您的需求:

如果要使用GPU。 您可以使用托管包装器(例如Slim DX / Sharp DX),这将花费大量时间来获得结果。 别忘了,通过gpu重新光栅化图像可能会导致质量下降。

如果只想旋转图像(0、90、180、270)? 您可以使用带有de ScanLine0选项的Bitmap类。 (这是为了保留质量和大小),您可以创建一个快速的实现。

看这里: 在C#中快速使用位图

我将为每个角度(0,90,180,270)创建一个算法。 因为您不想为每个像素计算x,y位置。 像下面这样。


小费:

尝试失去乘法/除法。

/*This time we convert the IntPtr to a ptr*/
byte* scan0 = (byte*)bData.Scan0.ToPointer();

for (int i = 0; i < bData.Height; ++i)
{
    for (int j = 0; j < bData.Width; ++j)
    {
        byte* data = scan0 + i * bData.Stride + j * bitsPerPixel / 8;

        //data is a pointer to the first byte of the 3-byte color data
    }
}

变成类似:

/*This time we convert the IntPtr to a ptr*/
byte* scan0 = (byte*)bData.Scan0.ToPointer();

byte* data = scan0;

int bytesPerPixel = bitsPerPixel / 8;

for (int i = 0; i < bData.Height; ++i)
{
    byte* data2 = data;
    for (int j = 0; j < bData.Width; ++j)
    {
        //data2 is a pointer to the first byte of the 3-byte color data

        data2 += bytesPerPixel;
    }
    data += bData.Stride;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM