[무지급함] 프린트에 관한 질문입니다^^;(BMP출력에 관해서....)
BMP파일 출력에 관한 질문입니다.
IMAGE객체에 있는 이미지를 그 컴터에 셋팅되있는 칼라말고 256칼라나 16칼라로 출력하려고 합니다.
책에서 그림출력에 찾아보니 이러한 소스가 있더군요
type
PPalentriesarray = ^Tpalentriesarray; {for palette re-construction}
TPalentriesarray = array[0..0] of TPaletteEntry;
procedure 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 := bm.Width;
//비트맵 원래의 너비를 저장해 둔다.
Bitmapinfosize := sizeof(Tbitmapinfo);
GetMem(lPBitmapInFo, BitmapInFoSize);
//비트맵의 구조를 할당한다.
FillChar(lpBitmapInFo^,BitmapInfosize, #0);
//Bitmapinfo 구조체에 필요한 데이터를 채워넣는다.
lpBitmapInfo^.bmiHeader.biSize := sizeof(TBitmapInfoHeader);
lpBitmapInfo^.bmiHeader.biWidth := OriginalWidth;
lpBitmapInfo^.bmiHeader.biHeight := bm.Height;
lpBitmapInfo^.bmiHeader.biPlanes := 1;
lpBitmapInfo^.bmiHeader.biBitCount := 4; ★요부분이 비트수를 결정하는거죠? 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;
중간에
lpBitmapInfo^.bmiHeader.biBitCount := 4; ★요부분이 비트수를 결정하는거죠? 4로하면 16칼라로 되나요?★
요부분의 숫자를 바꾸면 원하는칼라로 출력되겠죠?
음......근데.....이 프로시져를 어캐 사용해야될지 모르게쏘용
printer.begindoc;
요 중간에 어캐 써야되여?;;;;;;;;
printer.edddoc;
고수님덜 도움 좀 주세요;;;
델을 공부한지 이제 한달되어가는 초보에게 힘을;;;;;;
기왕 설명해주시는거 자세히좀 설명해주시면 정말 감사;;;;
폼에는 메인폼과 이미지객체 출력버튼 일캐 하나 맹그러놨음다.....TEST용....
도움 좀 주세효