Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 988

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
В Image2 рисунок на всю страницу A4, но печатает 3*5 см так ка считывает ACD, хотя рисунок Painta. Проблема в Windows XP.

Приложение:
  1. Printer.Orientation := poLandscape;
  2. Printer.BeginDoc;
  3. with Image2.Picture.BitMap do
  4. Printer.Canvas.CopyRect(Rect(0,0,1204,654),
  5. Canvas,Rect(0,0,1204,654));
  6. Printer.EndDoc;


Марина Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Марина (статус: Посетитель)
Вопрос отправлен: 18 октября 2007, 18:36
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, Марина!
Попробуйте использовать функцию StretchDraw вместо CopyRect. Примерно так:

var
PRect: Trect;
PBitMap: TBitmap;
begin
PBitmap := TBitMap.Create;
PBitmap.LoadFromFile('C:1.bmp');
with PRect do
   begin
     left := 0;
     top := 0;
     right := Printer.PageWidth;
     Bottom := Printer.PageHeight;
   end;
with printer do
   begin
     BeginDoc;
     font.name := 'Times New Roman';
     Canvas.StretchDraw(PRect, Bitmap);
     EndDoc;
   end;
PBitmap.Free;
end;

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 18 октября 2007, 18:57
Оценка за ответ: 5

Комментарий к оценке: Огромное спасибо! Удачи!

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, Марина!
Проблема не в виндовс, и не в делфи. проблема в том, что размер пикселя на экране и на принтере различен. причём значительно. есть такое понятие - DPI, которое в переводе с английского означает пикселей на дюйм. Обычно для дисплея это значения равно 96 или 120. а для слабенького струйного принтера - 300, а для хорошего - 600 и больше. тоесть, то что имеет размер 120 пикселей, на экране будет иметь линейный размер в один дюйм (25.4 мм), а на принтере 8, а то и 4 мм.
Что же делать? Вариант 1- узнать DPI принтера и пересчитать размеры.
вариант два - вы можете запросить размеры листа бумаги в пикселях и отталкиваться от него. (это свойства Printer.PageWidth и Printer.PageHeight). Но нужно обязательно помнить, что немногие принтеры могут печатать в нескольких милиметрах от края бумаги. А для многих принтеров это растояние равно сантиметр-два.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 18 октября 2007, 23:26
Оценка за ответ: 4


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 18 октября 2007, 19:03; участников в обсуждении: 1.
Feniks

Feniks (статус: Бакалавр), 18 октября 2007, 19:03 [#1]:

Вот есть еще один примерчик.
©Drkb::03262 Взято с Vingrad.ru http://forum.vingrad.ru

{
Печать изображения. Использует модуль Printers.
Должно работать со всеми типами графики: битмепами, метафайлами и иконками.
(c) Alexey Torgashin, 2007
 
Последняя версия функции всегда доступна в исходниках компонента ATViewer:
http://atorg.net.ru/delphi/atviewer.htm
 
Параметры:
- AImage: TImage объект.
- ACopies: число копий (можно задать 0 для одной копии).
- AFitToPage: умещать картинку в страницу принтера. Если картинка меньше
страницы и AFitOnlyLarger=False, то картинка будет растянута.
- AFitOnlyLarger: разрешает умещать только картинки, бОльшие размера страницы.
- ACenter: центрировать картинку по странице.
- APixelsPerInch: число точек на дюйм на экране. Передавайте сюда значение
св-ва PixelsPerInch Вашей формы или объекта Screen.
- ACaption: заголовок задания печати в Print Manager.
 
-----------------------------------
 
Image printing. Uses Printers unit.
Should work with all graphics: bitmaps, metafiles and icons.
 
Parameters:
- AImage: TImage object.
- ACopies: number of copies (you may set 0 for a single copy).
- AFitToPage: fit image to a printer page. If image is smaller than a page and
AFitOnlyLarger=False then image will be stretched up to a page.
- AFitOnlyLarger: allows to stretch images smaller than a page.
- ACenter: center image on a page.
- APixelsPerInch: pass here value of PixelsPerInch property of your form or
of a Screen object (Screen.PixelsPerInch).
- ACaption: print job caption in Print Manager.
}
 
function ImagePrint(
AImage: TImage;
ACopies: word;
AFitToPage,
AFitOnlyLarger,
ACenter: boolean;
APixelsPerInch: integer;
const ACaption: string): boolean;
var
bmp: TBitmap;
begin
bmp:= TBitmap.Create;
try
   bmp.PixelFormat:= pf24bit;
 
   {$ifdef ADV_IMAGE_CONV}
   if not CorrectImageToBitmap(AImage, bmp, clWhite) then
   begin
     Result:= false;
     Exit
   end;
   {$else}
   with AImage.Picture do
   begin
     bmp.Width:= Graphic.Width;
     bmp.Height:= Graphic.Height;
     bmp.Canvas.Draw(0, 0, Graphic);
   end;
   {$endif}
 
   Result:= BitmapPrint( //Declared below
     bmp,
     ACopies,
     AFitToPage,
     AFitOnlyLarger,
     ACenter,
     APixelsPerInch,
     ACaption);
 
finally
   bmp.Free;
end;
end;
 
 
function BitmapPrint(
ABitmap: TBitmap;
ACopies: word;
AFitToPage,
AFitOnlyLarger,
ACenter: boolean;
APixelsPerInch: integer;
const ACaption: string): boolean;
var
Scale, ScalePX, ScalePY, ScaleX, ScaleY: Double;
SizeX, SizeY,
RectSizeX, RectSizeY, RectOffsetX, RectOffsetY: integer;
i: integer;
Begin
Result:= true;
 
Assert(
   Assigned(ABitmap) and (ABitmap.Width>0) and (ABitmap.Height>0),
   'BitmapPrint: bitmap is empty.');
 
if ACopies = 0 then
   Inc(ACopies);
 
with Printer do
begin
   SizeX:= PageWidth;
   SizeY:= PageHeight;
 
   ScalePX:= GetDeviceCaps(Handle, LOGPIXELSX) / APixelsPerInch;
   ScalePY:= GetDeviceCaps(Handle, LOGPIXELSY) / APixelsPerInch;
 
   ScaleX:= SizeX / ABitmap.Width / ScalePX;
   ScaleY:= SizeY / ABitmap.Height / ScalePY;
 
   if ScaleX < ScaleY then
     Scale:= ScaleX
   else
     Scale:= ScaleY;
 
   if (not AFitToPage) or (AFitOnlyLarger and (Scale > 1.0)) then
     Scale:= 1.0;
 
   RectSizeX:= Trunc(ABitmap.Width * Scale * ScalePX);
   RectSizeY:= Trunc(ABitmap.Height * Scale * ScalePY);
 
   if ACenter then
   begin
     RectOffsetX:= (SizeX - RectSizeX) div 2;
     RectOffsetY:= (SizeY - RectSizeY) div 2;
   end
   else
   begin
     RectOffsetX:= 0;
     RectOffsetY:= 0;
   end;
 
   Title:= ACaption;
 
   try
     BeginDoc;
     try
       for i:= 1 to ACopies do
       begin
         Canvas.StretchDraw(
           Rect(
             RectOffsetX,
             RectOffsetY,
             RectOffsetX + RectSizeX,
             RectOffsetY + RectSizeY),
           ABitmap
           );
         if i < ACopies then
           NewPage;
       end;
     finally
       EndDoc;
     end;
   except
     Result:= false;
   end;
end;
end;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:55
Выполнено за 0.03 сек.