Я не могу понять, как распечатать несколько изображений на одной странице с помощью принтера, Я хочу отображать изображения рядом следующим образом:
Но проблема в том, что изображения всегда отображаются на всю страницу следующим образом:
У меня есть этот код:
procedure TForm1.Button1Click(Sender: TObject);
var
MyRect: TRect;
scale: Double;
Bitmap : TBitmap;
i: integer;
begin
try
Bitmap := TBitmap.Create;
Bitmap.Width := Image1.Picture.Width;
Bitmap.Height := Image1.Picture.Height;
Bitmap.Canvas.Draw(0,0,Image1.Picture.Graphic);
if PrintDialog1.Execute then
begin
if Printer.Orientation = poPortrait then
scale := GetDeviceCaps(Printer.Handle, LOGPIXELSX) / Screen.PixelsPerInch
else
scale := GetDeviceCaps(Printer.Handle, LOGPIXELSY) / Screen.pixelsperinch;
Printer.BeginDoc;
MyRect := Rect(0,0, trunc(Bitmap.Width * scale), trunc(Bitmap.Height * scale));
Printer.Canvas.StretchDraw(MyRect, Bitmap);
Printer.EndDoc;
end;
finally
Bitmap.Free;
end;
end;
Я хочу, чтобы принтер распечатывал изображения рядом, как мне это сделать? Кто-нибудь может мне помочь?
Обновлять:
procedure TForm1.Button1Click(Sender: TObject);
var
MyRect: TRect;
scale: Double;
Bitmap : TBitmap;
i, x, y, width, height, img_count: integer;
begin
Bitmap := TBitmap.Create;
x := 0;
y := 0;
img_count := 3;
try
begin
Bitmap.Width := Image1.Picture.Width;
Bitmap.Height := Image1.Picture.Height;
Bitmap.Canvas.Draw(0,0,Image1.Picture.Graphic);
if PrintDialog1.Execute then
begin
if Printer.Orientation = poPortrait then
scale := GetDeviceCaps(Printer.Handle, LOGPIXELSX) / Screen.PixelsPerInch
else
scale := GetDeviceCaps(Printer.Handle, LOGPIXELSY) / Screen.pixelsperinch;
Printer.BeginDoc;
for i := 1 to img_count do
begin
width := trunc(Bitmap.Width * scale / img_count);
height := trunc(Bitmap.Height * scale / img_count);
MyRect := Rect(x, y, width, height);
Printer.Canvas.StretchDraw(MyRect, Bitmap);
x := x + width;
end;
Printer.EndDoc;
end;
end;
finally
Bitmap.Free;
end;
end;
Теперь он отображает изображения как приклеенные друг к другу, и я хочу, чтобы они отображались с небольшим отступом между ними:
Это когда я добавляю поля:
Это без полей:
Ваш прямоугольник всегда помещается вверху слева. Вам нужно разместить его там, где вы хотите, чтобы он печатался. Ваша шкала значений также должна учитывать, сколько столбцов/строк вы хотите.
Вы должны наполовину понять свой код, тогда все станет очевидным. Canvas
и Rect
буквально просто так - и если вы увеличите свой прямоугольник по масштабу, вы никогда не поместите две картинки рядом. Сократите значения пополам и используйте параметры функций. Я буду использовать больше переменных, чтобы было более очевидно, почему ваш подход очень легко решить:
var
x, y, width, height: Integer;
...
begin
...
Printer.BeginDoc;
x:= 0; // Start on top left
y:= 0;
width:= trunc( Bitmap1.Width* scale/ 2 ); // Half of the size
height:= trunc( Bitmap1.Height* scale/ 2 )
Printer.Canvas.StretchDraw( Rect( x, y, width, height ), Bitmap1 );
x:= width; // Continue after picture on the right side
width:= trunc( Bitmap2.Width* scale/ 2 ); // Again half of the size
height:= trunc( Bitmap2.Height* scale/ 2 )
Printer.Canvas.StretchDraw( Rect( x, y, width, height ), Bitmap2 );
Printer.EndDoc;
В этом примере предполагается, что Bitmap1
и Bitmap2
имеют одинаковые размеры.
Спасибо, но есть ли способ изменить размер изображения, если оно большое, чтобы все изображения печатались рядом с одинаковым размером?
Да: вместо 2
используйте количество картинок.
Как добавить поля между изображениями, смотрите мое обновление выше.
Примите ответ, когда он решит вашу проблему. Создайте новый вопрос, когда у вас появится новый, где (опять же) вы должны показать, что вы пробовали до сих пор, а где потерпели неудачу. StackOverflow не предназначен ни для домашней работы, ни для завершения ваших проектов.
Смотрите мое обновление.
Задайте новый вопрос и покажите, что вы уже пробовали.
(1) Вы ДОЛЖНЫ поставить
Bitmap := TBitmap.Create;
ПЕРЕДtry
. (2) Вы можете найти решение по адресу stackoverflow.com/questions/60366432/…. На самом деле, я думаю, вы, возможно, уже видели эту страницу (поскольку ваше изображение идеально совпадает с изображением там по пикселям).