Главная страница
    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.005 c
2-1295032117
Сергей
2011-01-14 22:08
2011.04.24
Вызов функции из функции


15-1294596688
@!!ex
2011-01-09 21:11
2011.04.24
PropSheet не работает под Win 7 x64


2-1295179948
azl
2011-01-16 15:12
2011.04.24
Добавление разноцветной форматированной строки в RichEdit


2-1295522746
cyber-pilot
2011-01-20 14:25
2011.04.24
Вопрос про работу эксепшенов


3-1256924418
Незнайка
2009-10-30 20:40
2011.04.24
Работа с MSSQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский