![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Копирование Printer.Canvas в Bitmap [D7, WinXP]
AlexKocharin © (2004-10-13 20:59:00)Как скопировать изображение из канвы принтера (printer.canvas)
в Bitmap?
Пробовал и BitBlt, и StretchBlt, и canvas.CopyRect,
и canvas.assign - не помогает.
_iceman_ (2004-10-15 00:29:00) [1]To AlexKocharin ©
Я так понимаю, что ты тоже наступил на те же грабли, что и я когда-то. Приведенная ниже процедура почти полностью взята с Unoficial Delphi Printer Pages (кажется так). А дело все, видимо, в принтере, а точнее в драйверах. Например, для HP LJ 2200 с драйверами PS и PCL6 CopyRect для одного будет работать, а для другого нет.
procedure PrintImage(AImage: TImage);
var
Info: PBitmapInfo;
InfoSize, ImageSize: DWord;
Image: Pointer;
begin
Printer.BeginDoc;
GetDIBSizes(AImage.Picture.Bitmap.Handle, InfoSize, ImageSize);
Info:=AllocMem(InfoSize);
try
Image:=AllocMem(ImageSize);
try
GetDIB(AImage.Picture.Bitmap.Handle, 0, Info^, Image^);
StretchDIBits(Printer.Canvas.Handle,
0, 0, Printer.PageWidth, Printer.PageHeight,
0, 0, AImage.Width, AImage.Height,
Image, Info^, DIB_RGB_COLORS, SRCCOPY);
finally
FreeMem(Image, ImageSize);
end;
finally
FreeMem(Info, InfoSize);
end;
Printer.EndDoc;
end;</code
Fenik (2004-10-14 22:06:00) [2]Как изображение попало на printer.Canvas?
Может лучше до этого момента его ловить?
AlexKocharin (2004-10-14 16:55:00) [3]Что, никак нельзя, что ли?
AlexKocharin (2004-10-14 08:51:00) [4]А кто обещал, что нарисованное на printer.Canvas где-то хранится?
При печати сначала формируется изображение, а потом методом EndDoc посылается на печать.
Должно же оно до EndDoc'а где-то храниться.
Каждое следующее изображение, наносимое на канву, затирает то,
что было раньше на этом месте, т.е. изменяет канву, а не просто добавляет новые байты (иначе при наложении изображений было бы много глюков).
AlexKocharin (2004-10-14 08:34:00) [5]//Через метафайл попробуй
А как скопировать в метафайл?
И какая будет разница?
ЮЮ (2004-10-14 08:26:00) [6]А кто обещал, что нарисованное на printer.Canvas где-то хранится?
TBitmap.Canvas - да, т.к. Drawing on the canvas effectively modifies the underlying bitmap image pixels.
AlexKocharin (2004-10-14 08:16:00) [7]Через BrushCopy вроде то же самое.
AlexKocharin (2004-10-14 07:59:00) [8]
bmp.Width:=printer.PageWidth;
bmp.Height:=printer.PageHeight;
bmp.Canvas.CopyRect(
rect(0,0,printer.PageWidth,printer.PageHeight),printer.Canvas,
rect(0,0,printer.PageWidth,printer.PageHeight));
bmp.SaveToFile('1.bmp');
Выводит файл, содержащий белое полотно 2892x3969 px.
(А на канва принтера у меня не пустая)
Sun bittern (2004-10-14 06:03:00) [9]BrushCopy()?
TUser (2004-10-13 21:52:00) [10]Почему Canvas.CopyRect не помогает?
Гаврила (2004-10-13 21:33:00) [11]Через метафайл попробуй