wpf大图片处理速度优化:指针操作,并行操作,几十倍优化
我一直用GDI+做Winform 的基于指针的图片处理,这次下决心全部移到wpf上(主要是显示布局很方便)
采用的图片是
2512*3307 的大图 830万像素
类库基于WritableBitmapEx 的wpf版本
函数是我自己写的扩展方法,只是利用了 writableBitmapEx提供的环境 ,我懒得从头到尾自己写了
1.标准int32数组遍历计算 release
0.28s
unsafe public static void TestGray1(this WriteableBitmap bmp)
{
using (var context = bmp.GetBitmapContext())
{
int height = context.Height;
int width = context.Width;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
int pos=y * context.Width + x;
var c = context.Pixels[pos];
var r = (byte)(c >> 16);
var g = (byte)(c >> 8);
var b = (byte)(c);
var gray = ((r * 38 + g * 75 + b * 15) >> 7);
var color=(255 << 24) | (gray << 16) | (gray << 8) | gray;
context.Pixels[pos]=color;
}
}
}
}
2.标准int32指针遍历计算 release
0.04s
unsafe public static void TestGray2(this WriteableBitmap bmp)
{
using (var context = bmp.GetBitmapContext())
{
var ptr = context.Pixels;
int height = context.Height;
int width = context.Width;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
var c = *ptr;
var r = (byte)(c >> 16) ;
var g = (byte)(c >> 8) ;
var b = (byte)(c) ;
var gray = ((r * 38 + g * 75 + b * 15) >> 7);
var color = (255 << 24) | (gray << 16) | (gray << 8) | gray;
*ptr = color;
ptr++;
}
}
}
}
3.colorstruct指针 遍历计算
0.02 s
应该是已经到极限速度了[除了后面的并行方式],我已经想不出还有什么方法可以提高处理速度
而且这种方式是最直观的,最容易理解的处理方式,也便于以后维护
[StructLayout(LayoutKind.Sequential)]
public struct PixelColor
{
public byte Blue;
public byte Green;
public byte Red;
public byte Alpha;
}
unsafe public static void TestGray3(this WriteableBitmap bmp)
{
using (var context = bmp.GetBitmapContext())
{
var ptr = (PixelColor*)context.Pixels;
int height = context.Height;
&nb
补充:软件开发 , C# ,