Форум: "Начинающим";
Текущий архив: 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