Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2013, 22:28   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Восклицание Печать изображений в правильном размере.

Доброго времени суток!

Не получается вывести картинку на принтер в истинном размере.
С Canvas простого TImage работает и получается что надо на принтере(печатаю канву этого Image).

А вот если выводить изображения на принтер, то эти изображения получаются очень и очень маленькими. Почему так?

Собственно код:
Так рисую сетку изображений на Canvas TImage:
Код:
 procedure TForm1.DrawBtnClick(Sender: TObject);
var
  iRow, iCol, iBorderSize, iImgDistance, iRows, iColumns,
  iLeft, iTop: Integer;
  bmp: TBitmap;
begin
  iBorderSize := StrToInt(BorderSizeEdit.Text);
  iImgDistance := StrToInt(ImgsDistanceEdit.Text);
  iRows := StrToInt(RowsCountEdit.Text);
  iColumns := StrToInt(ColCountEdit.Text);
  iRow := 0;
  iCol := 0;
  iLeft := iBorderSize;
  iTop := iBorderSize;
  bmp := TBitmap.Create;
  try
    bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Source.bmp');
    with Img.Canvas do
    begin
      Brush.Color := clWhite;
      FillRect(Img.BoundsRect);

      for iRow := 1 to iRows do
      begin
        // Кальк. позицию строки
        if (iRow = 1) then
          iTop := iBorderSize
        else
          iTop := iBorderSize + (iImgDistance * (iRow - 1)) +
            (bmp.Height * (iRow - 1));

        // Кальк. позиции картинок в строке
        for iCol := 1 to iColumns do
        begin
          if (iCol = 1) then
            iLeft := iBorderSize
          else
            iLeft := iBorderSize + (iImgDistance * (iCol - 1)) +
              (bmp.Width * (iCol - 1));
          Draw(iLeft, iTop, bmp);
        end;
      end;
    end;
  finally
    FreeAndNil(bmp);
  end;
end;
Вот так печатаю:
Код:
procedure PrintImage(Image: TImage; ZoomPercent: Integer);
var
  relHeight, relWidth: Integer;

  procedure DrawImage(Canvas: TCanvas; DestRect: TRect; ABitmap: TBitmap);
  var
    Header, Bits: Pointer;
    HeaderSize: DWORD;
    BitsSize: DWORD;
  begin
    GetDIBSizes(ABitmap.Handle, HeaderSize, BitsSize);
    Header := AllocMem(HeaderSize);
    Bits := AllocMem(BitsSize);
    try
      GetDIB(ABitmap.Handle, ABitmap.Palette, Header^, Bits^);
      StretchDIBits(Canvas.Handle, DestRect.Left, DestRect.Top, DestRect.Right,
        DestRect.Bottom, 0, 0, ABitmap.Width, ABitmap.Height, Bits,
        TBitmapInfo(Header^), DIB_RGB_COLORS, SRCCOPY);
    finally
      FreeMem(Header, HeaderSize);
      FreeMem(Bits, BitsSize);
    end;
  end;

begin
  Screen.Cursor := crHourglass;
  Printer.BeginDoc;
  with Image.Picture.Bitmap do
  begin
    if ((Width / Height) > (Printer.PageWidth / Printer.PageHeight)) then
    begin
      // Stretch Bitmap to width of PrinterPage
      relWidth := Printer.PageWidth;
      relHeight := MulDiv(Height, Printer.PageWidth, Width);
    end
    else
    begin
      // Stretch Bitmap to height of PrinterPage
      relWidth := MulDiv(Width, Printer.PageHeight, Height);
      relHeight := Printer.PageHeight;
    end;
    relWidth := Round(relWidth * ZoomPercent / 100);
    relHeight := Round(relHeight * ZoomPercent / 100);
    DrawImage(Printer.Canvas, Rect(0, 0, relWidth, relHeight),
      Image.Picture.Bitmap);
  end;
  Printer.EndDoc;
  Screen.Cursor := crDefault;
end;

procedure TForm1.PrintBtnClick(Sender: TObject);
begin
  PrintImage(Img, 100);
end;
Итог правильный: http://i49.fastpic.ru/big/2013/0801/...cb24bfa3d7.png

----

Последний раз редактировалось Человек_Борща; 01.08.2013 в 22:36.
Человек_Борща вне форума Ответить с цитированием
Старый 01.08.2013, 22:29   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Стрелка Продолжение

А вот попытка рисовать на Canvas принтера:
Код:
var
  i, iRow, iCol, iBorderSize,  iImgDistance, iRows,
  iColumns, iLeft, iTop: Integer;
  bmp: TBitmap;
  bStop, bRowDone, bColDone: Boolean;
  P: TPoint;

  function CalcY: Integer;
  begin
    if (iRow = 1) then
      Result := iBorderSize
    else
      Result := iBorderSize + (iImgDistance * (iRow - 1)) +
        (bmp.Height * (iRow - 1));
  end;

  function CalcX: Integer;
  begin
    if (iCol = 1) then
      Result := iBorderSize
    else
      Result := iBorderSize + (iImgDistance * (iCol - 1)) +
        (bmp.Width * (iCol - 1));
  end;

begin
  iBorderSize := StrToInt(BorderSizeEdit.Text);
  iImgDistance := StrToInt(ImgsDistanceEdit.Text);
  iRows := StrToInt(RowsCountEdit.Text);
  iColumns := StrToInt(ColCountEdit.Text);
  iRow := 1;
  iCol := 1;
  // Начальные значения координат рисования
  iLeft := iBorderSize;
  iTop := iBorderSize;
  bmp := TBitmap.Create;
  try
    bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Source.bmp');
    Printer.BeginDoc;
    for i := 1 to 18 do
    begin
      if (iRow <= iRows) then
      begin
        iTop := CalcY;
        iLeft := CalcX;
        Printer.Canvas.Draw(iLeft, iTop, bmp);
        if not((iRow = iRows) and (iCol = iColumns)) then
        begin
          if (iCol = iColumns) then
          begin
            Inc(iRow);
            iCol := 1;
          end
          else
            Inc(iCol);
        end
        else
        begin
          ShowMessage('Новый лист!');
          Printer.NewPage;
          iRow := 1;
          iCol := 1;
        end;
      end;
    end;
    if Printer.Printing then
      Printer.EndDoc;

  finally
    FreeAndNil(bmp);
  end;
end;
Итог не правильный: http://i49.fastpic.ru/big/2013/0801/...81800713be.png

Где я ошибся?

Проект приложил.
Вложения
Тип файла: rar ImagesGrid.rar (12.9 Кб, 10 просмотров)

Последний раз редактировалось Человек_Борща; 01.08.2013 в 22:37.
Человек_Борща вне форума Ответить с цитированием
Старый 03.08.2013, 10:27   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Проблему решил, умножив размеры картинки на фактор DPI принтера:
<высота> * Фактор по оси Y div Пикселей на дюйм текущего экрана.
<ширина> * Фактор по оси X div Пикселей на дюйм текущего экрана.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Печать изображений средствами языка C# Mixim C# (си шарп) 0 27.01.2012 10:22
статья - О правильном составлении ТЗ. Часть 3 Pblog Обсуждение статей 0 27.02.2011 23:10
статья - О правильном составлении ТЗ. Часть 2 Pblog Обсуждение статей 0 27.02.2011 23:10
Загадка о размере файла .xls Jockernsk Microsoft Office Excel 10 23.10.2010 00:58
ссылка на ячейку в правильном формате Dutch Shultz Microsoft Office Excel 7 11.03.2009 18:35