hBm := bm.ReleaseHandle; <<==========여기서 메모리 에러가 나네요
RGB값이라 에러가 나는것 같네요.여기를 bitmap으로 바꿔야 할것 같은데.
방법이 생각이 안나네요..
요것 저것해봐도 자꾸 메모리 에러가 떨어지네요..
흑흑...초보좀 도와주세요..
procedure TForm1.BitBtn1Click(Sender: TObject);
var
preConv,postConv,TEmp : array[0..320*240*3-1] of byte ;
prefile,postFile : TFileStream;
DestDC : hdc;
FileHandle,iBytesRead : Integer;
bitMap : TbitMap;
i,j,k : Integer;
begin
try
prefile := TFileStream.Create('C:다운로드김수현RGBtestConv1.yvu',fmOpenReadWrite);
prefile.Position :=0;
prefile.Read(preConv,320*240*3);
ConvertYV12ToRGB24( @(preConv[0]), @(preConv[320*240]), @(preConv[320*240 + 320*60]), @postConv, 320, 240 );
postFile := TFileStream.Create('C:다운로드김수현RGBtestConv1.rgb',fmOpenReadWrite);
postFile.Position :=0;
postFile.write(PostConv, 320*240*3);
finally
prefile.Free;
postFile.free;
end;
// bitmap:= Canvas.;
BltTBitmapAsDib(DestDC ,0,0,320,240,@postConv);
end;
procedure TForm1.BltTBitmapAsDib(DestDC : hdc;{ handel of where blt}
x : word; {blt at x}
y : word; {blt at y}
Width : word; {width to stretch}
Height : word; {height to stretch}
bm : TbitMap); {the TBitmap to Blt}
var
OriginalWidth : longInt; {width of BM}
dc : hdc; {screen dc}
IsDestPaletteDevice : bool; {if the device uses palettes}
BitmapInFoSize : integer; {sizeof the bitmapinfoheader}
lPBitmapInFo : PBitmapInFo; {the bitmap info header}
hBm : hBitmap; {handle to the bitmap}
hPal : hPalette; {handel to the palette}
OldPal : hPalette; {temp palette}
hBits : THandle; {handle to the DIB bits}
pBits : pointer; {pointer to the DIB bits}
lPPalEntriesArray : PPalEntriesArray; {Palette entry array}
NumPalEntries : integer; {number of palette entries}
i : integer; {looping variable}
begin
//비트맵 원래의 너비를 저장해 둔다.
Originalwidth := 320;
//비트맵 원래의 너비를 저장해 둔다.
Bitmapinfosize := sizeof(Tbitmapinfo);
GetMem(lPBitmapInFo, BitmapInFoSize);
//비트맵의 구조를 할당한다.
FillChar(lpBitmapInFo^,BitmapInfosize, #0);
//Bitmapinfo 구조체에 필요한 데이터를 채워넣는다.
lpBitmapInfo^.bmiHeader.biSize := sizeof(TBitmapInfoHeader);
lpBitmapInfo^.bmiHeader.biWidth := OriginalWidth;
lpBitmapInfo^.bmiHeader.biHeight := 240;
lpBitmapInfo^.bmiHeader.biPlanes := 1;
lpBitmapInfo^.bmiHeader.biBitCount := 24; //★요부분이 비트수를 결정하는거죠? 4로하면 16칼라로 되나요?★
lpBitmapInfo^.bmiHeader.biCompression := BI_RGB;
lpBitmapInfo^.bmiHeader.biSizeImage := ((lpBitmapInfo^.bmiHeader.biWidth *
longint(lpBitmapInfo^.bmiHeader.biBitCount)) div 8) *
lpBitmapInfo^.bmiHeader.biHeight;
lpBitmapInfo^.bmiHeader.biXPelsPerMeter := 0;
lpBitmapInfo^.bmiHeader.biYPelsPerMeter := 0;
lpBitmapInfo^.bmiHeader.biClrUsed := 0;
lpBitmapInfo^.bmiHeader.biClrImportant := 0;
hBm := bm.ReleaseHandle; <<==========여기서 메모리 에러가 나네요
hPal := bm.ReleasePalette;
//스크린의 DC를 얻는다.
Dc := GetDc(0);
GetDiBits(dc, hBm, 0, lpBitmapInfo^.bmiHeader.biHeight, nil, TBitmapInfo(lpBitmapInfo^),DIB_RGB_COLORS);
//Bit를 위한 메모리 할당
hBits := GlobalAlloc(GMEM_MOVEABLE, lpBitmapInfo^.bmiHeader.biSizeImage);
pBits := GlobalLock(hBits);
GetDiBits(dc, hBm, 0, lpBitmapInfo^.bmiHeader.biHeight, pBits, BitmapInfo(lpBitmapInfo^),DIB_RGB_COLORS);
{Give back the screend dc}
dc := ReleaseDc(0, dc);
stretchDiBits(DestDc, 0, 0, 320, 240, 0, 0, OriginalWidth, lpBitmapInfo^.bmiHeader.biHeight,pBits,
lpBitmapInfo^,DIB_RGB_COLORS, SrcCopy);
GlobalUnLock(hBits);
GlobalFree(hBits);
FreeMem(lpBitmapInfo, BitmapInfoSize);
bm.Handle := hBm;
bm.Palette := hPal;
end;
BltTBitmapAsDib의 파라매터에는 bm이 TBitmap이라는 객체인데 배열을 넣어주셨네요... 당연히 에러가 나겠죠... TBitmap을 생성해서 넣어주셔야 겠네요...
^^ 항상 즐코하세요...