Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-16256
denis24
2004-01-26 12:18
2004.02.06
checklistbox.drawitem


6-16576
Roksolan
2003-12-01 09:10
2004.02.06
Обмен данными посредством TCP/IP


1-16306
deep.1
2004-01-25 16:50
2004.02.06
Сериализация в Delphi


4-16811
hfa
2003-11-28 17:52
2004.02.06
как открыть Iexplorer в новом окне и вставить ссылку в нее?


7-16758
Dimaz-z
2003-11-19 17:13
2004.02.06
Работа с адресной книгой Windows.





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