Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизПечать графического буфера Найти похожие ветки
← →
DimaK (2004-01-15 21:05) [0]Добрый вечер. Мучаюсь над печатью рисунка. Смысл такой, имеется переменная Bitmap: TBitmap в которую из области экрана вырезается определенный кусок и по необходимости сохраняется в BMP файл. Такой вопросик, а можно содержимое этой переменной распечатать, или содержимое графического буфера? Если нет, то как правильно распечатать содержимое Image1?
Заранее благодарен!
← →
DimaK (2004-01-16 11:54) [1]Неужели никто не знает?
Я нашол примеры на DelphiWorld, печатает, но рисунок почему-то очень маленький :(
← →
Семен Сорокин (2004-01-16 12:00) [2]используюй Printer.Canvas
главное помнить что размер точки на принтере <> размеру точки на экране.
← →
DimaK (2004-01-16 12:36) [3]что-то не пойму :(
Вот мой код, натолкните на ошибку (русинок печатается очень маленький)
procedure PrintBitmap(Canvas: TCanvas; DestRect: TRect; Bitmap: TBitmap);
var BitmapHeader: pBitmapInfo;
BitmapImage: Pointer;
HeaderSize: DWORD;
ImageSize: DWORD;
begin
GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);
GetMem(BitmapHeader, HeaderSize);
GetMem(BitmapImage, ImageSize);
try
GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);
StretchDIBits(Canvas.Handle, DestRect.Left, DestRect.Top,
DestRect.Right - DestRect.Left, DestRect.Bottom - DestRect.Top,
0, 0, Bitmap.Width, Bitmap.Height, BitmapImage,
TBitmapInfo(BitmapHeader^), DIB_RGB_COLORS, SRCCOPY)
finally
FreeMem(BitmapHeader);
FreeMem(BitmapImage);
end
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if PrintDialog1.Execute then
begin
Printer.BeginDoc;
PrintBitmap(Printer.Canvas, Image1.Canvas.ClipRect, Image1.Picture.Bitmap);
Printer.EndDoc;
end;
end;
← →
Семен Сорокин (2004-01-16 12:37) [4]procedure TForm1.Button1Click(Sender: TObject);
begin
if PrintDialog1.Execute then
begin
Printer.BeginDoc;
PrintBitmap(Printer.Canvas, Printer.Canvas.ClipRect, Image1.Picture.Bitmap);
Printer.EndDoc;
end;
end;
← →
Тимохов (2004-01-16 12:38) [5]Повторю за Семеном: "главное помнить что размер точки на принтере <> размеру точки на экране".
Узнай ширину принтера в точках исходя из этого печатай. Например юзай TPrinter.PageWidth
← →
DimaK (2004-01-20 12:58) [6]Не помогает, может кто еще знает?
← →
Тимохов (2004-01-20 13:00) [7]Что не помогает?
Ты код приведи, который у тебя получился.
← →
DimaK (2004-01-20 13:54) [8]Смысл такой, имею в графическом буфере картинку, которую надо распечатать. Как сам буфер послать на печать не знаю, поэтому временно сохраняю картинку в bmp файл. Все нормально, размеры, палитра и т.д. Загружаю этот файл в Image и печатаю, после чего файл удаляю. Криво конечно, на как красиво сделать не додумался. Пробовал приведенный мной выше пример + исправление [4] - результат тотже, т.е. картинка печатается очень маленькой (чуть меньше спичечного коробка), пробовал так:
if PrintDialog1.Execute then
begin
Printer.BeginDoc;
PrintBitmap(Printer.Canvas, Canvas.ClipRect, Image1.Picture.Bitmap);
Printer.EndDoc;
end;
ничего не изменилось.
← →
Тимохов (2004-01-20 14:02) [9]Пиши так, и все будет ОК
Printer.BeginDoc;
Printer.newpage();
Printer.Canvas.StretchDraw(Rect(0, 0, printer.pagewidth, printer.pageheight),Image1.Picture.Bitmap);
Printer.EndDoc;
← →
Тимохов (2004-01-20 14:04) [10]Добавление:
Возмозно newpage не надо (не помню) - сам хелп почитай.
← →
DimaK (2004-01-21 13:28) [11]Результат такой, моя картинка размером 548x317 32bit т.е. почти как стандартная открытка. Попробовал совет [9], в результате при печати рисунок растянулся на весь лист и пропала палитра цветов :(
← →
Тимохов (2004-01-21 14:16) [12]
> рисунок растянулся на весь лист
Конечно растянется на весь лист. Тебе разве не этого надо было.
Подумай сам, немного. Наверное догадаешься, что если тебе надо распечатать с сохранением пропорций, то нужно сначала определиться с тем книжную или альбомную печать нужно делать, допустим, книжну, тогда пишешь
Printer.Canvas.StretchDraw(Rect(0, 0, printer.pagewidth, round(printer.pagewidth * Image1.Picture.Bitmap.height / Image1.Picture.Bitmap.width)),Image1.Picture.Bitmap);
> и пропала палитра цветов
Логично, принтер то черно-белый...
← →
DimaK (2004-01-21 15:15) [13]Да, но почему из-за ч/б принтера пропала палитра?
Когда печатался маленький рисунок - палитра была нормальная!
В принципе я делал также:
procedure TForm1.Button2Click(Sender: TObject);
var ScaleX, ScaleY: Integer;
R: TRect;
begin
if PrintDialog1.Execute then
begin
Printer.BeginDoc;
with Printer do
try
ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch;
ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch;
R := Rect(0, 0, Image1.Picture.Width * ScaleX,
Image1.Picture.Height * ScaleY);
Canvas.StretchDraw(R, Image1.Picture.Graphic);
finally
EndDoc;
end;
end;
end;
Результат тотже, рисунок по размерам печатается нормально, но очень страшно выгледет (т.е. теряется палитра цветов). Что можно еще сделать? Заранее благодарен!
← →
DimaK (2004-01-21 15:39) [14]Да, забыл сказать, попробовал совет [9]+[12], но размер печати всеравно не соответсвует оригинальному, в моем последнем коде [13] всетаки размер чуть-чуть меньше (где-то на 0,5 см.) от оригинального, это для меня не критично, но как быть с палитрой, вопрос остается открытым.
← →
KSergey (2004-01-21 15:42) [15]А что такое по вашему "оригинальный размер"? Вы где его указали, интересно?
← →
DimaK (2004-01-21 19:53) [16]Оригинальный размер для меня это 548x317, Image имеет такойже размер, вот мне и надо чтобы на печати было тоже самое (все подогнано под ламинат).
← →
Тимохов (2004-01-21 19:59) [17]Печатая как в [8] , ты и получаешь тоже самое, только маленькое, т.к. точки на принтере другие (меньше).
← →
KSergey (2004-01-22 08:37) [18]> [16] DimaK © (21.01.04 19:53)
> Оригинальный размер для меня это 548x317
548 чего? Попугаев? Килограмм? А 317 чего??
← →
DimaK (2004-01-22 13:39) [19]А как можно в примере [8] подсчитать точки на принтере для нужного размера?
> 548 чего? Попугаев? Килограмм? А 317 чего??
Чего-чего точек естественно, не сантиметровже.
548 - ширина, 317 - высота
← →
Тимохов (2004-01-22 13:40) [20]Неужто тебе не понятно, что ты именно так и печатаешь 548x317 точек. Просто на принтере точки меньше... :(((
← →
DimaK (2004-01-22 13:44) [21]Это я понял, но ведь как-то можно нормально распечатать (как любой графический редактор, он ведь не уменьшает). Вопрос в том, что примерно надо добавить и как подсчитать и умножить точки принтера, чтобы получился нужный размер.
← →
KSergey (2004-01-22 20:26) [22]О, понимание приходит ;)
Слухай теперь сюды ;)
В виднах у device context (это примерно то, чо в дельфи называется Canvas) есть различные режимы координат.
Переключаются ф-цией SetMapMode.
Там можно пикселы, миллиметры и т.д. запузырить.
GetDeviceCaps(Printer.Handle, LOGPIXELSX) - это получаем разрешение принтера (что-то такое, ох и навру сейчас! но про ф-ции почитай, я дело говорю ;)
А теперь - стопудово рабочая ф-ция печати картинки какого нужно размера. Не моя, взял по ссылкам. Но вот чтобы размер стал какой надо - надо с разрешениями и режимами тебе разобраться.
Так же настоятельно советую найти ее оригинал в инете, т.к. тут я что-то подправил (создание доп. битмапа).
// печать картинок
// (с) LongIsland (08.05.03 10:53) hydralex@mail.ru
// http://delphimaster.net/view/1-1052334020/
// (c) wea@felten.co.at (Alexander Wernhart)
// On Tue, 4 Feb 1997 20:54:43 -0300, Ruy Ponce de Leon Junior <rplj@di.ufpe.br>
// http://doc.trecom.tomsk.su/Delphi/UnofficialDevelopersFAQ/pages/printer.htm
procedure PicturePrint(APic: TPicture; ARect: TRect);
var
Info: PBitmapInfo;
InfoSize, ImageSize: DWord;
Image: Pointer;
BitMap: TBitmap;
begin
Printer.Canvas.Brush.Style := bsClear; // сам добавил; не уверен, что надо
BitMap := TBitmap.Create; // весь дальнейший код работает только с Bitmap
try
BitMap.Assign (APic.Graphic);
GetDIBSizes (BitMap.Handle, InfoSize, ImageSize);
Info := AllocMem (InfoSize);
try
Image := AllocMem (ImageSize);
try
GetDIB (BitMap.Handle, 0, Info^, Image^);
CalcCardPrRect (n);
StretchDIBits (Printer.Canvas.Handle,
ARect.Left, ARect.Top, ARect.Right-ARect.Left, ARect.Bottom-ARect.Top,
0, 0, BitMap.Width, BitMap.Height,
Image, Info^, DIB_RGB_COLORS, SRCCOPY);
finally
FreeMem(Image, ImageSize);
end;
finally
FreeMem(Info, InfoSize);
end;
finally
BitMap.Free;
end;
end; // procedure PicturePrint
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.049 c