I think this will solve your problem. Even if it only works with bitmaps (probably the most common type of image you will use), you can use it for icons and metafiles too by converting them into bitmaps. You can do this using a temporary bitmap, and simply draw the contents of the TImage canvas on it. Then simply change the reference to the timage bitmap to your custom bitmap.
procedure TPrintBMPForm.Print1Click(Sender: TObject);
var
Info: PBitmapInfo;
InfoSize: Integer;
Image: Pointer;
ImageSize: DWORD;
begin
inherited;
with Image1.Picture.Bitmap do
begin
{ Call GetDIBSizes to get the Info header and image size }
GetDIBSizes(Handle, InfoSize, ImageSize);
{ Allocate memory for the info header }
Info := MemAlloc(InfoSize);
try
{ Allocate memory for the Image }
Image := MemAlloc(ImageSize);
try
{ Retrieve the bitmap bits in device-independent format, the
palette adn the Info header }
GetDIB(Handle, Palette, Info^, Image^);
with Info^.bmiHeader do begin
{ Call StretchDIBits to print the bitmap }
Printer.BeginDoc;
try
StretchDIBits(Printer.Canvas.Handle, 0, 0, Printer.PageWidth,
Printer.PageHeight, 0, 0, biWidth, biHeight, Image, Info^,
DIB_RGB_COLORS, SRCCOPY);
finally
Printer.EndDoc;
end;
end;
finally
FreeMem(Image, ImageSize); // Free the memory allocated
end;
finally
FreeMem(Info, InfoSize);
end;
end;
end;
I hope this will help you,
See ya,
CyberWolf
0
Question has a verified solution.
Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.
I think this will solve your problem. Even if it only works with bitmaps (probably the most common type of image you will use), you can use it for icons and metafiles too by converting them into bitmaps. You can do this using a temporary bitmap, and simply draw the contents of the TImage canvas on it. Then simply change the reference to the timage bitmap to your custom bitmap.
procedure TPrintBMPForm.Print1Click(
var
Info: PBitmapInfo;
InfoSize: Integer;
Image: Pointer;
ImageSize: DWORD;
begin
inherited;
with Image1.Picture.Bitmap do
begin
{ Call GetDIBSizes to get the Info header and image size }
GetDIBSizes(Handle, InfoSize, ImageSize);
{ Allocate memory for the info header }
Info := MemAlloc(InfoSize);
try
{ Allocate memory for the Image }
Image := MemAlloc(ImageSize);
try
{ Retrieve the bitmap bits in device-independent format, the
palette adn the Info header }
GetDIB(Handle, Palette, Info^, Image^);
with Info^.bmiHeader do begin
{ Call StretchDIBits to print the bitmap }
Printer.BeginDoc;
try
StretchDIBits(Printer.Canv
Printer.PageHeight, 0, 0, biWidth, biHeight, Image, Info^,
DIB_RGB_COLORS, SRCCOPY);
finally
Printer.EndDoc;
end;
end;
finally
FreeMem(Image, ImageSize); // Free the memory allocated
end;
finally
FreeMem(Info, InfoSize);
end;
end;
end;
I hope this will help you,
See ya,
CyberWolf