问题:我的问题出在我自己写的cBlur模块中,它不能正常工作,请熟练VC++的朋友一定帮忙改改,我相信这个问题对熟练VC的朋友来说是很简单的。谢谢
我找到一个实现图像模糊的源代码(建议粘贴到VC中分析):HRESULT __stdcall GPX_Blur (HDC PicDestDC,
HDC PicSrcDC,
int *Response)
{
int BitCount = 0;
int Result = 0;
int Width = 0;
int Height = 0;
BITMAPINFO info;
HBITMAP PicSrcHwnd = GetBitmapHandle (PicSrcDC, &info, &Width, &Height); if (! PicSrcHwnd)
{
*Response = (int)Result;
return (E_FAIL);
} int LineWidth = Width * 3;
if (LineWidth % 4)
LineWidth += (4 - LineWidth % 4); BitCount = LineWidth * Height;
LPBYTE Bits = new BYTE[BitCount]; Result = GetDIBits (PicSrcDC, PicSrcHwnd, 0, Height, Bits, &info, DIB_RGB_COLORS);
if (Result)
{
int i = 0, j = 0, k = 0;
for (int h = 1; h < Height - 1; h++)
for (int w = 1; w < Width - 1; w++)
{
i = h * LineWidth + 3 * w;
j = (h + 1) * LineWidth + 3 * w;
k = (h - 1) * LineWidth + 3 * w; Bits[i+2] = (Bits[i-1] + Bits[j-1] + Bits[k-1] +
Bits[i+2] + Bits[j+2] + Bits[k+2] +
Bits[i+5] + Bits[j+5] + Bits[k+5]) / 9;
Bits[i+1] = (Bits[i-2] + Bits[j-2] + Bits[k-2] +
Bits[i+1] + Bits[j+1] + Bits[k+1] +
Bits[i+4] + Bits[j+4] + Bits[k+4]) / 9;
Bits[ i ] = (Bits[i-3] + Bits[j-3] + Bits[k-3] +
Bits[ i ] + Bits[ j ] + Bits[ k ] +
Bits[i+3] + Bits[j+3] + Bits[k+3]) / 9;
} ::SetDIBitsToDevice (PicDestDC, 0, 0, Width, Height, 0, 0, 0, Height, Bits, &info, 0);
::DeleteObject (PicSrcHwnd);
delete [] Bits; *Response = (int)Result;
return (S_OK);
} return (E_FAIL);
}我现在已经把它制作成API函数,并从VB向这个函数传递了图像的数组(包含R、G、B分量值):void _stdcall cBlur(ColorTypes *suBits, ColorTypes *sdBits, short hWidth, short hHeight, short hLevel)
{
int x,y;
int i = 0, j = 0, k = 0; for (y=1; y<50; y++)
{
for (x=1; x<50; x++)
{
i = y * hWidth + x;
j = (y + 1) * hWidth + x;
k = (y - 1) * hWidth + x; suBits[i+2].Rouge = int((suBits[i-1].Rouge + suBits[j-1].Rouge + suBits[k-1].Rouge +
suBits[i+2].Rouge + suBits[j+2].Rouge + suBits[k+2].Rouge +
suBits[i+5].Rouge + suBits[j+5].Rouge + suBits[k+5].Rouge) / 9);
suBits[i+2].Vert = int((suBits[i-1].Vert + suBits[j-1].Vert + suBits[k-1].Vert +
suBits[i+2].Vert + suBits[j+2].Vert + suBits[k+2].Vert +
suBits[i+5].Vert + suBits[j+5].Vert + suBits[k+5].Vert) / 9);
suBits[i+2].Bleu = int((suBits[i-1].Bleu + suBits[j-1].Bleu + suBits[k-1].Bleu +
suBits[i+2].Bleu + suBits[j+2].Bleu + suBits[k+2].Bleu +
suBits[i+5].Bleu + suBits[j+5].Bleu + suBits[k+5].Bleu) / 9); suBits[i+1].Rouge = int((suBits[i-2].Rouge + suBits[j-2].Rouge + suBits[k-2].Rouge +
suBits[i+1].Rouge + suBits[j+1].Rouge + suBits[k+1].Rouge +
suBits[i+4].Rouge + suBits[j+4].Rouge + suBits[k+4].Rouge) / 9);
suBits[i+1].Vert = int((suBits[i-2].Vert + suBits[j-2].Vert + suBits[k-2].Vert +
suBits[i+1].Vert + suBits[j+1].Vert + suBits[k+1].Vert +
suBits[i+4].Vert + suBits[j+4].Vert + suBits[k+4].Vert) / 9);
suBits[i+1].Bleu = int((suBits[i-2].Bleu + suBits[j-2].Bleu + suBits[k-2].Bleu +
suBits[i+1].Bleu + suBits[j+1].Bleu + suBits[k+1].Bleu +
suBits[i+4].Bleu + suBits[j+4].Bleu + suBits[k+4].Bleu) / 9); suBits[ i ].Rouge = int((suBits[i-3].Rouge + suBits[j-3].Rouge + suBits[k-3].Rouge +
suBits[ i ].Rouge + suBits[ j ].Rouge + suBits[ k ].Rouge +
suBits[i+3].Rouge + suBits[j+3].Rouge + suBits[k+3].Rouge) / 9);
suBits[ i ].Vert = int((suBits[i-3].Vert + suBits[j-3].Vert + suBits[k-3].Vert +
suBits[ i ].Vert + suBits[ j ].Vert + suBits[ k ].Vert +
suBits[i+3].Vert + suBits[j+3].Vert + suBits[k+3].Vert) / 9);
suBits[ i ].Bleu = int((suBits[i-3].Bleu + suBits[j-3].Bleu + suBits[k-3].Bleu +
suBits[ i ].Bleu + suBits[ j ].Bleu + suBits[ k ].Bleu +
suBits[i+3].Bleu + suBits[j+3].Bleu + suBits[k+3].Bleu) / 9);
}
}
}1. 这个值在VB中是以二维数组的形式存在: For y = 1 To h
For x = 1 To w
With sdBits(x, y)
...
End With
Next x
Next y2. 当被VC++接收后,以一维数组的形式存在: for (y=0; y<hHeight; y++)
{
for (x=0; x<hWidth; x++)
{
Val=suBits[y*hWidth+x];
...
}
}
我找到一个实现图像模糊的源代码(建议粘贴到VC中分析):HRESULT __stdcall GPX_Blur (HDC PicDestDC,
HDC PicSrcDC,
int *Response)
{
int BitCount = 0;
int Result = 0;
int Width = 0;
int Height = 0;
BITMAPINFO info;
HBITMAP PicSrcHwnd = GetBitmapHandle (PicSrcDC, &info, &Width, &Height); if (! PicSrcHwnd)
{
*Response = (int)Result;
return (E_FAIL);
} int LineWidth = Width * 3;
if (LineWidth % 4)
LineWidth += (4 - LineWidth % 4); BitCount = LineWidth * Height;
LPBYTE Bits = new BYTE[BitCount]; Result = GetDIBits (PicSrcDC, PicSrcHwnd, 0, Height, Bits, &info, DIB_RGB_COLORS);
if (Result)
{
int i = 0, j = 0, k = 0;
for (int h = 1; h < Height - 1; h++)
for (int w = 1; w < Width - 1; w++)
{
i = h * LineWidth + 3 * w;
j = (h + 1) * LineWidth + 3 * w;
k = (h - 1) * LineWidth + 3 * w; Bits[i+2] = (Bits[i-1] + Bits[j-1] + Bits[k-1] +
Bits[i+2] + Bits[j+2] + Bits[k+2] +
Bits[i+5] + Bits[j+5] + Bits[k+5]) / 9;
Bits[i+1] = (Bits[i-2] + Bits[j-2] + Bits[k-2] +
Bits[i+1] + Bits[j+1] + Bits[k+1] +
Bits[i+4] + Bits[j+4] + Bits[k+4]) / 9;
Bits[ i ] = (Bits[i-3] + Bits[j-3] + Bits[k-3] +
Bits[ i ] + Bits[ j ] + Bits[ k ] +
Bits[i+3] + Bits[j+3] + Bits[k+3]) / 9;
} ::SetDIBitsToDevice (PicDestDC, 0, 0, Width, Height, 0, 0, 0, Height, Bits, &info, 0);
::DeleteObject (PicSrcHwnd);
delete [] Bits; *Response = (int)Result;
return (S_OK);
} return (E_FAIL);
}我现在已经把它制作成API函数,并从VB向这个函数传递了图像的数组(包含R、G、B分量值):void _stdcall cBlur(ColorTypes *suBits, ColorTypes *sdBits, short hWidth, short hHeight, short hLevel)
{
int x,y;
int i = 0, j = 0, k = 0; for (y=1; y<50; y++)
{
for (x=1; x<50; x++)
{
i = y * hWidth + x;
j = (y + 1) * hWidth + x;
k = (y - 1) * hWidth + x; suBits[i+2].Rouge = int((suBits[i-1].Rouge + suBits[j-1].Rouge + suBits[k-1].Rouge +
suBits[i+2].Rouge + suBits[j+2].Rouge + suBits[k+2].Rouge +
suBits[i+5].Rouge + suBits[j+5].Rouge + suBits[k+5].Rouge) / 9);
suBits[i+2].Vert = int((suBits[i-1].Vert + suBits[j-1].Vert + suBits[k-1].Vert +
suBits[i+2].Vert + suBits[j+2].Vert + suBits[k+2].Vert +
suBits[i+5].Vert + suBits[j+5].Vert + suBits[k+5].Vert) / 9);
suBits[i+2].Bleu = int((suBits[i-1].Bleu + suBits[j-1].Bleu + suBits[k-1].Bleu +
suBits[i+2].Bleu + suBits[j+2].Bleu + suBits[k+2].Bleu +
suBits[i+5].Bleu + suBits[j+5].Bleu + suBits[k+5].Bleu) / 9); suBits[i+1].Rouge = int((suBits[i-2].Rouge + suBits[j-2].Rouge + suBits[k-2].Rouge +
suBits[i+1].Rouge + suBits[j+1].Rouge + suBits[k+1].Rouge +
suBits[i+4].Rouge + suBits[j+4].Rouge + suBits[k+4].Rouge) / 9);
suBits[i+1].Vert = int((suBits[i-2].Vert + suBits[j-2].Vert + suBits[k-2].Vert +
suBits[i+1].Vert + suBits[j+1].Vert + suBits[k+1].Vert +
suBits[i+4].Vert + suBits[j+4].Vert + suBits[k+4].Vert) / 9);
suBits[i+1].Bleu = int((suBits[i-2].Bleu + suBits[j-2].Bleu + suBits[k-2].Bleu +
suBits[i+1].Bleu + suBits[j+1].Bleu + suBits[k+1].Bleu +
suBits[i+4].Bleu + suBits[j+4].Bleu + suBits[k+4].Bleu) / 9); suBits[ i ].Rouge = int((suBits[i-3].Rouge + suBits[j-3].Rouge + suBits[k-3].Rouge +
suBits[ i ].Rouge + suBits[ j ].Rouge + suBits[ k ].Rouge +
suBits[i+3].Rouge + suBits[j+3].Rouge + suBits[k+3].Rouge) / 9);
suBits[ i ].Vert = int((suBits[i-3].Vert + suBits[j-3].Vert + suBits[k-3].Vert +
suBits[ i ].Vert + suBits[ j ].Vert + suBits[ k ].Vert +
suBits[i+3].Vert + suBits[j+3].Vert + suBits[k+3].Vert) / 9);
suBits[ i ].Bleu = int((suBits[i-3].Bleu + suBits[j-3].Bleu + suBits[k-3].Bleu +
suBits[ i ].Bleu + suBits[ j ].Bleu + suBits[ k ].Bleu +
suBits[i+3].Bleu + suBits[j+3].Bleu + suBits[k+3].Bleu) / 9);
}
}
}1. 这个值在VB中是以二维数组的形式存在: For y = 1 To h
For x = 1 To w
With sdBits(x, y)
...
End With
Next x
Next y2. 当被VC++接收后,以一维数组的形式存在: for (y=0; y<hHeight; y++)
{
for (x=0; x<hWidth; x++)
{
Val=suBits[y*hWidth+x];
...
}
}
解决方案 »
- 关于当前桌面的广播
- [combobox]如何实现菜单式的Combobox?
- 关于如何在窗体之间传值的问题
- 如果动态更改桌面背景。(紧急求肋!!!!!!)
- UNICODE 字符集下的字段保存到数据库出现超出设定长度
- 达人请进,小弟跪求请教一个菜鸟级问题!谢谢各位了!
- 新问题
- 问一个比较白痴的问题
- dcom 在dot net平台中的位置/角色?
- 用VC6如何检查磁盘不是本地硬盘,而是USB.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 请教大侠,把光盘一放到光驱里边,在电脑上马上就会弹出个窗口,说明光盘中内容的安装等,这个是利用什么实现的,谢谢!
- 求助:如何判断局域网内另外一台电脑上是否存在一个指定路径的文件?
B As Byte
G As Byte
R As Byte
A As Byte
End TypePrivate sub Blur()
Dim suBits() As ColorTypes
Dim sdBits() As ColorTypes
Call cBlur(suBits(0, 0), sdBits(0, 0), hBitmap.hWidth, hBitmap.hHeight, 0)
...
End Sub