Главная страница
    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.004 c
15-1294522195
Юрий
2011-01-09 00:29
2011.04.24
С днем рождения ! 9 января 2011 воскресенье


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


15-1294435799
Юрий
2011-01-08 00:29
2011.04.24
С днем рождения ! 8 января 2011 суббота


15-1294819013
KSergey
2011-01-12 10:56
2011.04.24
Синхронизация файлов по FTP


15-1294834077
George
2011-01-12 15:07
2011.04.24
TIdHTTP.Get и Windows 7





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