비트맵 출력을 하려는데 감이 안오네요..
BltTBitmapAsDib프로시져를 불러오려는데 어떻게 해야 할지 감이 안오네요
BitBtn1Click부분에 BltTBitmapAsDib(DestDC ,0,0,320,240,bitmap);
의 각각의 파라미터를 어떻게 써야 할지 모르겠어요..
bitmap파라미터 부분을 어떻게 해야할지 bitmap으로 posconv를 할당해야 하잖아요 어떻게 해야하나요...
그리고 DestDC도 이렇게 하는게 맞는지 정말 처음 하는거라 감이 안잡히네요 고수님 많은 부탁드립니다.
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 : 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);
//bitMap.LoadFromFile(postFile);
finally
prefile.Free;
postFile.free;
end;
// bitmap:= Canvas.;
//BltTBitmapAsDib(DestDC ,0,0,320,240,bitmap);
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, x, y, width, height, 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;