首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

求教一个图像处理有关问题(图像处理速度)

2012-02-16 
求教一个图像处理问题(图像处理速度)我有了一个BitMap(BM1),现在要将BM1中的每一像素映射到一张新的BitMap

求教一个图像处理问题(图像处理速度)
我有了一个BitMap(BM1),现在要将BM1中的每一像素映射到一张新的BitMap(BM2)。这要如何作呢?
设一个像素在BM1的像素坐标为(X1,Y1)。移动后对应BM2的坐标是(x2,y2)
映射函数为
x2=f1(X1)
y2=f2(Y1)

我自己是这样作的
dim   w   as   int32=BM1.Width
dim   h   as   int32=BM1.Height
for   n   as   int32=0   to   h-1
    for   m   as   int32=0   to   w-1
        '通过f1、f2的计算,获得点的位置后取点
        BM2.SetPixel(f1(m),f2(n),   BM1.GetPixel(m,   n))
    next
next

这样作在处理400×600图像时要2-3分钟,而我同学用c++6。0作的可以实时处理,让我很想不通。
请问大虾,在net中有没有函数作这个?

[解决办法]
微软官方的 开源
.NET 版本 PhotoShop

http://www.getpaint.net/index2.html
[解决办法]
SetPixel、GetPixel会很消耗时间
给你提供点线索Bitmap.LockBits()\Bitmap.UnlockBits(),搜索别人怎么用的
通过内存直接访问,速度会快数千倍
[解决办法]
public static Surface CopyFromBitmap(Bitmap bitmap)
{
Surface surface = new Surface(bitmap.Width, bitmap.Height);
BitmapData bd = bitmap.LockBits(surface.Bounds, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

unsafe
{
for (int y = 0; y < bd.Height; ++y)
{
Memory.Copy((void *)surface.GetRowAddress(y),
(byte *)bd.Scan0.ToPointer() + (y * bd.Stride), (ulong)bd.Width * ColorBgra.SizeOf);
}
}

bitmap.UnlockBits(bd);
return surface;
}
[解决办法]
To: forgot(忘记forgot2000)
这里你用的是directx方法么?本人对这个没怎么了解。望能与您多交流。请告诉我联系方式如何,交个朋友,我的QQ:565419980,MSN:simtel_006@hotmail.com。最近也在学directX,但是似乎资料不是很多。你有没有可以推荐的书。或者别的,用.net开发的。

热点排行