图象抖动代码(200分)

  • 主题发起人 主题发起人 landersxu
  • 开始时间 开始时间
L

landersxu

Unregistered / Unconfirmed
GUEST, unregistred user!
BOOL LimbPatternM4(HWND hWnd)
{
DWORD BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
DWORD i,j;
unsigned char num;
BYTE M4Pattern[16][16];

for(i=0;i<8;i++)
for(j=0;j<8;j++)
M4Pattern[j]=4*BayerPattern[j];

for(i=8;i<16;i++)
for(j=0;j<8;j++)
M4Pattern[j]=4*BayerPattern[i-8][j]+2;

for(i=0;i<8;i++)
for(j=8;j<16;j++)
M4Pattern[j]=4*BayerPattern[j-8]+3;

for(i=8;i<16;i++)
for(j=8;j<16;j++)
M4Pattern[j]=4*BayerPattern[i-8][j-8]+1;

BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);

if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
{
MessageBox(hWnd,&quot;Error alloc memory!&quot;,&quot;Error Message&quot;,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}

lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);

//copy image data
memcpy(lpTempImgData,lpImgData,BufSize);

for(y=0;y<bi.biHeight;y++){
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);
for(x=0;x<bi.biWidth;x++){
num=(unsigned char)*lpPtr++;
if ( num > M4Pattern[y&15][x&15])
*(lpTempPtr++)=(unsigned char)255;
else *(lpTempPtr++)=(unsigned char)0;
}
}

if(hBitmap!=NULL)
DeleteObject(hBitmap);
hDc=GetDC(hWnd);
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);

hf=_lcreat(&quot;c://limbm4.bmp&quot;,0);
_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,BufSize);
_lclose(hf);

ReleaseDC(hWnd,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}

上面是一段M4抖动的C代码,有那位能帮我译成DELPHI的,所有的分都给了。
 
delphi有一个水纹函数不知道对你有帮助不?
要是需要就留下邮箱
 
那几个数据类型不知道怎么弄。 搜搜看吧
 
我的邮箱 landersxu@hotmail.com tianlove兄发一个我看看
 
BayerPattern 这个数组是什么,你编译一下,好几个变量不知道哪里冒出来的

function LimbPatternM4(hWnd: HWND): Bool;
var
BufSize: DWORD;
lpImgData: PBITMAPINFOHEADER;
lpPtr: LPSTR;
hTempImgData: HLOCAL;
lpTempImgData: PBITMAPINFOHEADER;
lpTempPtr: LPSTR;
hDc_: HDC;
hf: HFILE;
x, y: LongInt;
i, j: DWORD;
num: word;
M4Pattern, BayerPattern: array[0..15, 0..15] of byte;

begin
Result := False;
for i := 0 to 7 do begin
for j := 0 to 7 do begin
M4Pattern[j] := 4 * BayerPattern[j];
end;
end;

for i := 8 to 15 do begin
for j := 0 to 7 do begin
M4Pattern[j] := 4 * BayerPattern[i - 8][j] + 2;
end;
end;

for i := 0 to 7 do begin
for j := 8 to 15 do begin
M4Pattern[j] := 4 * BayerPattern[j - 8] + 3;
end;
end;

for i := 8 to 15 do begin
for j := 8 to 15 do begin
M4Pattern[j] := 4 * BayerPattern[i - 8][j - 8] + 1;
end;
end;

BufSize := bf.bfSize - sizeof(BITMAPFILEHEADER);

hTempImgData := LocalAlloc(LHND, BufSize);
if (hTempImgData = nil) then begin
MessageBox(hWnd, 'Error alloc memory!', 'Error Message', MB_OK + MB_ICONEXCLAMATION);
Exit;
end;

lpImgData := PBITMAPINFOHEADER(GlobalLock(hImgData));
lpTempImgData := PBITMAPINFOHEADER(LocalLock(hTempImgData));

//copy image data
Move(lpTempImgData^, lpImgData^, BufSize);

for y := 0 to bi.biHeight - 1 do begin
lpPtr := PChar(lpImgData + (BufSize - LineBytes - y * LineBytes));
lpTempPtr := PChar(lpTempImgData + (BufSize - LineBytes - y * LineBytes));
for x := 0 to bi.biWidth - 1 do begin
Inc(lpPtr);
num := Word(lpPtr^);
Inc(lpTempPtr);
if (num > M4Pattern[y and 15][x and 15]) then lpTempPtr^ := 255
else lpTempPtr^ := 0;
end;
end;
if (hBitmap <> nil) then DeleteObject(hBitmap);
hDc := GetDC(hWnd);
hBitmap := CreateDIBitmap(hDc, LPBITMAPINFOHEADER(lpTempImgData), LONG(CBM_INIT),
LPSTR(lpTempImgData) + sizeof(BITMAPINFOHEADER) + NumColors * sizeof(RGBQUAD),
LPBITMAPINFO(lpTempImgData), DIB_RGB_COLORS);

//hf := _lcreat(&quot;c: //limbm4.bmp&quot;, 0);
//_lwrite(hf, LPSTR(@bf), sizeof(BITMAPFILEHEADER));
//_lwrite(hf, LPSTR(lpTempImgData), BufSize);
//_lclose(hf);

ReleaseDC(hWnd, hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
Result := TRUE;
end;
 
后退
顶部