Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.04.24;
Скачать: CL | DM;

Вниз

Как в метафаил скопировать битмап?   Найти похожие ветки 

 
Alex_C   (2011-01-20 12:52) [0]

Впервые столкнулся с необходимостью печати на принтере BitMap"а. Почитав по этому поводу в инете, понял, что для корректной печати нужно использовать TMetafile.
Делаю:

   PrevMetaFile  :=  TMetaFile.Create;
   PrevMetafile.Width  := DrawBitMap.Width;
   PrevMetafile.Height := DrawBitMap.Height;

   MetaCanvas  :=  TMetafileCanvas.Create(PrevMetafile, 0);
   with MetaCanvas do
   begin
     Pen.Color   := clBlack;
     Brush.Color := clWhite;
     FillRect(Rect( 0, 0, PrevMetafile.Width, PrevMetafile.Height));
   end;

  MetaCanvas.CopyRect(Rect(0, 0, PrevMetaFile.Width,
     PrevMetaFile.Height),
     DrawBitMap.Canvas,
     Rect(0, 0, PrevMetaFile.Width, PrevMetaFile.Height));

  MetaCanvas.Free;
   
   Printer.BeginDoc;
   Printer.Canvas.StretchDraw(Rect(0, 0, Printer.PageWidth,  
     Printer.PageHeight),  PrevMetaFile);
   Printer.EndDoc;
   PrevMetaFile.Free;


Печатается пустой лист. Для пробы пробовал непосредственно на канвасе метафайла рисовать LineTo и т.п. - тогда печатается.
Вопрос: как содержание битмама скопировать в метафаил?


 
Ega23 ©   (2011-01-20 12:55) [1]

http://delphimaster.net/view/2-1295382612/


 
Alex_C   (2011-01-20 13:04) [2]

Да спасибо, посмотрел!
Это я уже знаю - не подходит - при разтягивании битмапа шрифты получаются некрасивые.
Нашел как скопировать битмап:

MetaCanvas.Draw( 0 , 0 , DrawBitmap);

Теперь следующий вопрос:
Если делать надписи на битмапе, а затем его

Printer.Canvas.StretchDraw

То получает мпроблему со шрифмами - вернее при их маштабировании.
Если все рисовать сразу на метафайле, а затем его вывобить на печать

Printer.Canvas.StretchDraw

проблем со шрифтами нет, но появляется другая проблема:
у меня часть объектов на битмапе рисуется с полупрозрачным фоном
Вот функция для этого:

procedure BlendBitmap(Src, Dest: TBitmap; Amount: Byte; Left, Top:
 Integer; BackColor: TColor; Transparent: Boolean);

 function CandC(C1, C2: TRGBTriple): Boolean;
 begin {Сравнение двух цветов}
   Result := (C1.rgbtBlue = C2.rgbtBlue) and
     (C1.rgbtGreen = C2.rgbtGreen) and
     (C1.rgbtRed = C2.rgbtRed);
 end;
 {Процедура установления уровня прозрачности
  изображения Dest, расположенного над изображением Src.
  Amount - уровень прозрачности в промежутке [0..255].
  Left, Top - левый верхний угол Dest.
  BackColor - цвет, который не нужно изменять,
  если Transparent = True.}
var
 x, y, y1, y2, x1, x2: Integer;
 ps, pd: pRGBTriple;
 rgb: TRGBTriple;
 A1, A2: Double;
begin
 Src.PixelFormat := pf24Bit;
 Dest.PixelFormat := pf24Bit;
 A1 := Amount / 255;
 A2 := 1 - A1;
 {Изменяется только та часть изображения,
  которая расположена над исходным}
 y1 := Max(0, Top);
 x1 := Max(0, Left);
 x2 := Min(Src.Width - 1, Left + Dest.Width - 1);
 y2 := Min(Src.Height - 1, Top + Dest.Height - 1);
 rgb.rgbtRed := Lo(BackColor);
 rgb.rgbtGreen := Lo(BackColor shr 8);
 rgb.rgbtBlue := Lo((BackColor shr 8) shr 8);
 for y := y1 to y2 do
 begin
   ps := Src.ScanLine[y];
   pd := Dest.ScanLine[y - Top];
   Inc(ps, x1);
   if Left < 0 then
     Inc(pd, Abs(Left));
   for x := x1 to x2 do
   begin
     if not (Transparent and CandC(pd^, rgb)) then
       with pd^ do
       begin
         rgbtBlue := Round(A1 * ps^.rgbtBlue + A2 * rgbtBlue);
         rgbtGreen := Round(A1 * ps^.rgbtGreen + A2 * rgbtGreen);
         rgbtRed := Round(A1 * ps^.rgbtRed + A2 * rgbtRed);
       end;
     Inc(pd);
     Inc(ps);
   end;
 end;
end;

При рисовании на метафайле это не работает.
Можно ли решить эту проблему?


 
Ega23 ©   (2011-01-20 13:17) [3]


> Можно ли решить эту проблему?

Ознакомься сначала здесь
http://www.gunsmoker.ru/2008/10/x-y-z.html
потом здесь
http://lurkmore.ru/%D0%A1%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC_%D1%83%D1%82%D0%B5%D0%BD%D0%BA%D0%B0



Страницы: 1 вся ветка

Текущий архив: 2011.04.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
15-1294608594
Юрий
2011-01-10 00:29
2011.04.24
С днем рождения ! 10 января 2011 понедельник


2-1295381178
kokj007
2011-01-18 23:06
2011.04.24
перевести 20.01.10 в HEX(FA,EE,F8,95)


2-1295276909
Студент
2011-01-17 18:08
2011.04.24
Ищу примеры работы с интерфейсами на Паскале/Делфи


15-1294737725
aka
2011-01-11 12:22
2011.04.24
Форум


15-1294911645
stenfit
2011-01-13 12:40
2011.04.24
работа с zip