Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.06;
Скачать: CL | DM;

Вниз

Печать графического буфера   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.025 c
14-16744
Dark Simpson
2004-01-15 19:58
2004.02.06
Геморрой с Офисом 97


6-16546
SDF
2003-11-06 08:01
2004.02.06
Работа с Indy


1-16360
Andrys
2004-01-24 08:48
2004.02.06
Текст на экране


14-16735
Volodya_
2004-01-16 01:28
2004.02.06
IE


6-16554
Delphi5.01
2003-11-30 22:08
2004.02.06
блокируется Интернет при использовании компонента IdHttp