안녕하세요?
여기저기서 자료를 얻어서 아래와 같이 코딩했는데 이상합니다.
배경 이미지와 사진을 합성해서 프린트를 하려고 하는데 최초에 배경이나 사진만은 프린트가 잘 됩니다.
하지만!! 합성한 이미지를 출력하면 빈 페이지만 프린트가 됩니다.
PrintImage함수는 TImage객체를 받아서 PrintImg함수를 호출합니다.
PrintImage함수에서 넘겨받는 TImage는 이미 화면에 뿌려준 비트맵이구요.
혹시나 해서 PrintImg함수내에 넘겨받은 비트맵을 화일로 저장도 해봤는데
화일은 잘 생성이 되더라구요.
왜 프린트만 안되는걸까요?
앗!!!!! 차이점을 알아냈습니닷!!!!
합성하기전에는 컬러수가 16M이었는데 합성한후 64K로 바뀌었습니다.
아래 함수를 써서 프린트를 하면 16M컬러는 인쇄가 되는데 64K컬러는 인쇄가 되질 않습니다.
으헉~~~~ 컬러수에 따라서 어떻게 프린트를 해야 하는거죠????
=======================================================================
procedure TForm1.PrintImg(Canvas: TCanvas; DestRect: TRect; ABitmap: TBitmap);
var
Header, Bits: Pointer;
HeaderSize, BitsSize: Integer;
begin
GetDIBSizes(ABitmap.Handle, HeaderSize, BitsSize);
GetMem(Header, HeaderSize);
GetMem(Bits, BitsSize);
try
GetDIB(ABitmap.Handle, ABitmap.Palette, Header^, Bits^);
StretchDIBits(Canvas.Handle, DestRect.Left, DestRect.Top,
DestRect.Right - DestRect.Left, DestRect.Bottom - DestRect.Top,
0, 0, ABitmap.Width, ABitmap.Height, Bits, TBitmapInfo(Header^),
DIB_RGB_COLORS, SRCCOPY);
finally
FreeMem(Header, HeaderSize);
FreeMem(Bits, BitsSize);
end;
end;
procedure TForm1.PrintImage(Sender: TObject);
var
ScaleX, ScaleY: Integer;
R: TRect;
begin
with Printer do begin
BeginDoc;
ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch;
ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch;
R := Rect(0, 0, (Sender as TImage).Picture.Width * ScaleX, (Sender as TImage).Picture.Height * ScaleY);
PrintImg(Canvas, R, (Sender as TImage).Picture.Bitmap);
EndDoc;
end;
end;
=======================================================================
호출은 합성한 그림이 BgImage라면
PrintImage(BgImage); 라고 호출했습니다.
아 거참....왜 합성하기전엔 프린트가 잘 되는데 합성한후에는 안되는걸까요?
화일로도 잘 저장되는 그림인데.
제발 도와주세요~~~~
자답을 하게 되는군요.
흠~ 주위에서 참고할수 있는 비트맵을 트루컬러로 인쇄하는 루틴은 16만컬러 이상만 프린트가 되는것 같습니다.
제가한 루틴은 16만 컬러의 사진과 배경을 사용자가 알맞게 조정해서 최종적으로 합성하는 작업이있습니다. 제가 참고한 합성 루틴이 저장을 해보니까 64K컬러로 변하더라구요.
그래서 프린트도 안되고.
그래서 비트맵을 강제로 16만컬러로 컬러수를 조정했습니다.
아래 루틴에서 PrintImage를 호출할때 넘겨주는 비트맵 객체의 컬러수를 16만컬러로 강제 조정한후 넘겨주니까 아주 잘 인쇄가 되더군요.
만약 넘겨주는 비트맵 객체 이름이 BackImg라고 한다면 아래와 같이 해서 넘겨주면 됩니다.
TBitmap(BackImg.Picture.Graphic).PixelFormat:=TPixelFormat(pf24Bit);
bemore님의 홈페이지에서 도움을 얻었습니다.
간접적으로나마 감사드립니다.
참고로 bemore님의 홈페이지는 http://user.chollian.net/~bemore 입니다.
> 안녕하세요?
> 여기저기서 자료를 얻어서 아래와 같이 코딩했는데 이상합니다.
> 배경 이미지와 사진을 합성해서 프린트를 하려고 하는데 최초에 배경이나 사진만은 프린트가 잘 됩니다.
> 하지만!! 합성한 이미지를 출력하면 빈 페이지만 프린트가 됩니다.
> PrintImage함수는 TImage객체를 받아서 PrintImg함수를 호출합니다.
> PrintImage함수에서 넘겨받는 TImage는 이미 화면에 뿌려준 비트맵이구요.
> 혹시나 해서 PrintImg함수내에 넘겨받은 비트맵을 화일로 저장도 해봤는데
> 화일은 잘 생성이 되더라구요.
> 왜 프린트만 안되는걸까요?
>
>
> 앗!!!!! 차이점을 알아냈습니닷!!!!
> 합성하기전에는 컬러수가 16M이었는데 합성한후 64K로 바뀌었습니다.
> 아래 함수를 써서 프린트를 하면 16M컬러는 인쇄가 되는데 64K컬러는 인쇄가 되질 않습니다.
> 으헉~~~~ 컬러수에 따라서 어떻게 프린트를 해야 하는거죠????
>
> =======================================================================
> procedure TForm1.PrintImg(Canvas: TCanvas; DestRect: TRect; ABitmap: TBitmap);
> var
> Header, Bits: Pointer;
> HeaderSize, BitsSize: Integer;
> begin
> GetDIBSizes(ABitmap.Handle, HeaderSize, BitsSize);
> GetMem(Header, HeaderSize);
> GetMem(Bits, BitsSize);
> try
> GetDIB(ABitmap.Handle, ABitmap.Palette, Header^, Bits^);
> StretchDIBits(Canvas.Handle, DestRect.Left, DestRect.Top,
> DestRect.Right - DestRect.Left, DestRect.Bottom - DestRect.Top,
> 0, 0, ABitmap.Width, ABitmap.Height, Bits, TBitmapInfo(Header^),
> DIB_RGB_COLORS, SRCCOPY);
> finally
> FreeMem(Header, HeaderSize);
> FreeMem(Bits, BitsSize);
> end;
> end;
>
> procedure TForm1.PrintImage(Sender: TObject);
> var
> ScaleX, ScaleY: Integer;
> R: TRect;
>
> begin
> with Printer do begin
> BeginDoc;
> ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch;
> ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch;
> R := Rect(0, 0, (Sender as TImage).Picture.Width * ScaleX, (Sender as TImage).Picture.Height * ScaleY);
> PrintImg(Canvas, R, (Sender as TImage).Picture.Bitmap);
> EndDoc;
> end;
> end;
> =======================================================================
>
> 호출은 합성한 그림이 BgImage라면
> PrintImage(BgImage); 라고 호출했습니다.
> 아 거참....왜 합성하기전엔 프린트가 잘 되는데 합성한후에는 안되는걸까요?
> 화일로도 잘 저장되는 그림인데.
> 제발 도와주세요~~~~