Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Копирование 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]

Через метафайл попробуй


Наверх

Титульная страница Поиск, карта сайта Написать письмо