Q&A

  • 프린트에 관한 질문입니다^^;(BMP출력에 관해서....)
[무지급함] 프린트에 관한 질문입니다^^;(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용....

도움 좀 주세효
0  COMMENTS