Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.04.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





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


15-1294598101
from_california
2011-01-09 21:35
2011.04.24
заполнение таблиц в ms sql server management studio


2-1295032117
Сергей
2011-01-14 22:08
2011.04.24
Вызов функции из функции


3-1257170221
mom
2009-11-02 16:57
2011.04.24
Ehlib 4.0 порядок следования столбцов


4-1238870788
antonn
2009-04-04 22:46
2011.04.24
подмена координат клика курсора для определенного окна





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский