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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 750

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

Как в делфи7 распечатать картинку?метод я знаю но при печати печатается не всё картинка а только её часть.Кстати картинка находится в image3(да и подскажите как в делфи работать со сканерами)

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

Вопрос задал: Аксион (статус: 4-ый класс)
Вопрос отправлен: 17 июля 2007, 10:27
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Скачай, например, себе книжку "Библия Delphi" Михаила Фленова aka Horrific\'a. Там есть печать картинок с примером. Ссылка вот:

http://www.sitysoft.com/modules/mydownloads/singlefile.php?cid=80&lid=689

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 18 июля 2007, 08:26
Оценка за ответ: 3

Комментарий к оценке: зачем мне её скачивать - когда она у меня дома лежит :) и этот пример именно от туда

procedure TForm1.Button1Click(Sender: TObject);
var
X1,X2,Y1,Y2:Integer;
PointsX,PointsY:double;
PrintDlg:TPrintDialog;
begin
PrintDlg:=TPrintDialog.Create(Owner);
if PrintDlg.Execute then
begin
Printer.BeginDoc;
Printer.Canvas.Refresh;
PointsX:=GetDeviceCaps(Printer.Canvas.Handle,LOGPIXELSX)/70;
PointsY:=GetDeviceCaps(Printer.Canvas.Handle,LOGPIXELSY)/70;

X1:=round((Printer.PageWidth - Image1.Picture.Bitmap.Width*PointsX)/2);
Y1:=round((Printer.PageHeight - Image1.Picture.Bitmap.Height*PointsY)/2);
X2:=round(X1+Image1.Picture.Bitmap.Width*PointsX);
Y2:=round(Y1+Image1.Picture.Bitmap.Height*PointsY);
Printer.Canvas.CopyRect(Rect(X1,Y1,X2,Y2),Image1.Picture.Bitmap.Canvas,
Rect(0,0,Image1.Picture.Bitmap.Width,Image1.Picture.Bitmap.Height));

Printer.EndDoc;
end;
PrintDlg.Free;
end;


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

Всего сообщений: 18; последнее сообщение — 23 июля 2007, 08:22; участников в обсуждении: 3.
Dron

Dron (статус: Студент), 17 июля 2007, 10:42 [#1]:

> метод я знаю но при печати печатается не всё картинка а только её часть
Уточните, как именно вы отправляете картинку на печать?
С уважением.
Аксион

Аксион (статус: 4-ый класс), 17 июля 2007, 10:54 [#2]:

ВОТ МЕТОД

procedure TForm1.Button1Click(Sender: TObject);
var
X1,X2,Y1,Y2:Integer;
PointsX,PointsY:double;
PrintDlg:TPrintDialog;
begin
PrintDlg:=TPrintDialog.Create(Owner);
if PrintDlg.Execute then
begin
Printer.BeginDoc;
Printer.Canvas.Refresh;
PointsX:=GetDeviceCaps(Printer.Canvas.Handle,LOGPIXELSX)/70;
PointsY:=GetDeviceCaps(Printer.Canvas.Handle,LOGPIXELSY)/70;

X1:=round((Printer.PageWidth - Image1.Picture.Bitmap.Width*PointsX)/2);
Y1:=round((Printer.PageHeight - Image1.Picture.Bitmap.Height*PointsY)/2);
X2:=round(X1+Image1.Picture.Bitmap.Width*PointsX);
Y2:=round(Y1+Image1.Picture.Bitmap.Height*PointsY);
Printer.Canvas.CopyRect(Rect(X1,Y1,X2,Y2),Image1.Picture.Bitmap.Canvas,
Rect(0,0,Image1.Picture.Bitmap.Width,Image1.Picture.Bitmap.Height));

Printer.EndDoc;
end;
PrintDlg.Free;
end;
Да и надо учесть что картинка может быть как большого 1600х1200 так и маленького 100х80 разрешения
(Да и насчёт печатается не всё картинка а только её часть это я печатал картинки большого разрешения 1024х768 маленькие не пробовал)
Аксион

Аксион (статус: 4-ый класс), 17 июля 2007, 11:08 [#3]:

упс извеняюсь картинка находится не в image3 а в image1
Dron

Dron (статус: Студент), 17 июля 2007, 11:16 [#4]:

> упс извеняюсь картинка находится не в image3 а в image1
Господи, да какая разница-то? :-)

А этот код взят откуда-то или вы сами писали? Явно есть ошибка при пересчёте координат. Изображение должно подгоняться под размеры страницы, а оно наоборот вылезает из них.

Попробуйте на маленькой картинке - что получится?

Кстати, чтобы не тратить чернила, можно отправлять печать на виртуальный принтер ("печать в файл").
С уважением.
Аксион

Аксион (статус: 4-ый класс), 17 июля 2007, 12:00 [#5]:

Тут такая проблема краски у меня нет а печать в файл - такого я не нашёл (почему не знаю хотя я както уже использовал виртуальный принтер ) а код этот взят откудато я его не писал (ударение на а)
Dron

Dron (статус: Студент), 17 июля 2007, 13:27 [#6]:

По поводу печати в файл:
У TPrintDialog есть свойство PrintToFile. Вот его и нужно использовать.

По поводу координат - пройдите каждую строку и проверьте значения переменных X1,Y1,X2,Y2 под отладчиком. Если картинка вылезает за страницу - явно в координатах просчёт.
С уважением.
Аксион

Аксион (статус: 4-ый класс), 18 июля 2007, 09:08 [#7]:

min@y™ зачем мне её скачивать - когда она у меня дома лежит :) и этот пример именно от туда
min@y™

min@y™ (статус: Доктор наук), 18 июля 2007, 10:10 [#8]:

Странно... Вот ещё примерчик:

procedure TForm1.Button1Click(Sender: TObject);
var
ScaleX, ScaleY: Integer;
R: TRect;
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;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 18 июля 2007, 10:17 [#9]:

А отлаживать печать ИМХО лучше всего на виртуальном PDF-принтере aka PDFFactory или бесплатном doPDF v5. Получается многостраничный PDF-файл, который можно посмотреть в АкробатРидере. И никакой краски и бумаги не изводить.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Аксион

Аксион (статус: 4-ый класс), 18 июля 2007, 10:31 [#10]:

этот пример не работает посли нажатия на кнопку в трее появляется изображение принтера но через секунду исчезает а печать не начинается
min@y™

min@y™ (статус: Доктор наук), 18 июля 2007, 11:09 [#11]:

Скачай себе базу Delphi World 6. Там много примеров графической печати.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 18 июля 2007, 11:53 [#12]:

Если тебе нужно, штобы картинка масштабировалась под поля принтера, то ты некорректно задал вопрос. Надо было писать не "печатается не всё картинка а только её часть", а "картинка не влезает на страницу". Я запустил Delphi и доработал последний пример так:

procedure TForm1.Button1Click(Sender: TObject);
var
ScaleX, ScaleY: Integer;
R: TRect;
Ratio: Extended; // Коэффициент масштабирования
begin
if not PrintDialog1.Execute
then Exit;

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);

// Масштабирование картинки под размеры страницы принтера!!
if R.Right + 1 > PageWidth
then begin
Ratio:= (R.Right + 1) / PageWidth; // отношение ширины картинки к ширине страницы
R.Right:= PageWidth;
R.Bottom:= Round(R.Bottom / Ratio);
end;
if R.Bottom + 1 > PageHeight
then begin
Ratio:= (R.Bottom + 1) / PageHeight; // отношение высоты картинки к высоте страницы
R.Bottom:= PageHeight;
R.Right:= Round(R.Right / Ratio);
end;

Canvas.StretchDraw(R, Image1.Picture.Graphic); // **
finally
EndDoc; // **
end;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Аксион

Аксион (статус: 4-ый класс), 18 июля 2007, 12:23 [#13]:

Delphi World 6 я скачал уже месяц назад но те примеры мне не подошли
min@y™

min@y™ (статус: Доктор наук), 19 июля 2007, 08:06 [#14]:

А мой последний пример подошёл?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Аксион

Аксион (статус: 4-ый класс), 19 июля 2007, 09:36 [#15]:

Я еще не пробовал у меня при печати в фаил создаются фаил с расширением xps и припопытки открыть открывается IE7 не возможно отобразить страницу, а краски щас нет но обязательно попробую попозже.
min@y™

min@y™ (статус: Доктор наук), 20 июля 2007, 08:12 [#16]:

Скачай себе PDFFactory или doPDF v5. Незаменимая вещь при отдалке печати. Я именно на виртуальном принтере отлаживал последний пример. Попробуй, не пожалеешь.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Аксион

Аксион (статус: 4-ый класс), 20 июля 2007, 10:01 [#17]:

Я скачал PDFFactory 3.15 попробовал напечатать картинку расширением 1024х768 но в pfd файле оказался пустой лист!При печати изображения 800х600 тоже самое.
min@y™

min@y™ (статус: Доктор наук), 23 июля 2007, 08:22 [#18]:

Тогда ничем помочь не могу. У меня всё работает. Версия PDFFactory - 2.43.

Попробуй скачать бесплатный doPDF v5.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

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

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