Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.15;
Скачать: CL | DM;

Вниз

Вопрос по печати Bitmap в Delphi   Найти похожие ветки 

 
Martyn   (2002-04-02 11:27) [0]

Здравствуйте все!

Уже замучился со следующей проблемой - вот ее суть:

Есть база данных фирмы, занимающейся оптовой реализацией. На каждый приход товара вместе с товаром приходят сертификаты качества производителя, которые сканируются и хранятся в формате bmp. При печати расходной накладной необходимо, чтобы одновременно печатались все сертификаты качества товаров, находящихся в этой накладной:

В связи с тем, что все сертификаты отсканированы в А4 Portrait и в целях экономии бумаги необходимо размещать 2 сертификата на одном листе (т.е. производить уменьшение) принтер ставится в LandScape.

Если какой-либо позиции в накладной соответствует два сертификата анализа, то все нормально:

if Printer.Printing then NewPage else BeginDoc;
Bmp := TBitmap.Create;
try
Bmp.LoadFromFile("01.bmp");

Rect.Left := 0;
Rect.Top := 0;
Rect.Right := Round(PageWidth/2);
Rect.Bottom := PageHeight;

Canvas.StretchDraw(Rect, Bmp);
finally
Bmp.Free;
end;

Bmp := TBitmap.Create;
try
Bmp.LoadFromFile("02.bmp");

Rect.Left := Round(PageWidth/2);
Rect.Top := 0;
Rect.Right := PageWidth;
Rect.Bottom := PageHeight;

Canvas.StretchDraw(Rect, Bmp);
finally
Bmp.Free;
end;


на лист печатается два сертификата рядышком, все в норме, но если товару соответствует один сертификат, то следующий код выводит на печать пустой лист:

if Printing then NewPage else BeginDoc;

RotateBmp("01.bmp"); /поворот изображения
на 90 градусов из Portrait в
LandScape, для того, чтобы
сертификат печатался с
масштабом 100%

Bmp := TBitmap.Create;
try
Bmp.LoadFromFile("01.bmp");

Rect.Left := 0;
Rect.Top := 0;
Rect.Right := PageWidth;
Rect.Bottom := PageHeight;

Canvas.StretchDraw(Rect, Bmp);
finally
Bmp.Free;
end;


Все попытки выводят на печать пустой лист.

Если кто-что знает, буду очень признателен.

Принтер canon LBP-810.

С уважением.

Игорь В.Мартынов.


 
Song ©   (2002-04-02 11:37) [1]

Вполне возможно что PageWidth и/или PageHeight определяются неправильно, что приведёт к неправильному прямоугольнику Rect и как следствие к неправильной печати.


 
Martyn   (2002-04-02 11:43) [2]

Насколько помню, PageWidth около 6000 pixels а PageHeight - около 4400


 
Song ©   (2002-04-02 11:55) [3]

и как же он Вам на бумаге забабахает столько? :))
Наверно, надо делать CopyRect предварительно до размера листа, потом уже посылать на канву.


 
Song ©   (2002-04-02 11:56) [4]

А хотя... в первом же случае получилось...


 
Vogul   (2002-04-02 12:04) [5]

Интересно, а как это поворачиваешь изображение?
01.bmp на диске что-ли перевернется?


 
Alx2 ©   (2002-04-02 12:07) [6]

>Martyn (02.04.02 11:43)
>Насколько помню, PageWidth около 6000 pixels
>а PageHeight - около 4400

Кажется, где-то есть ограничение на размер одного BitMapa.


 
-=CrazyFish=- ©   (2002-04-02 12:34) [7]

На прошлой недели я тоже бился с похожим глюком, печатал на Xerox DP битмапки, используя QReport. На предварительном просмотре все было отлично, а при печати шли пустые листы. Такая фигня была только при глубине цвета 16 бит и только на этом принтере. Все стало нормально после того как перед печатью я стал выставлять свойство Bitmap.PixelFormat:=pf16bit; (можно pf8bit, pf24bit, короче что то стандартное) (при глубине цвета 16 бит в системе у битмэпки почему то выставлялось 15 бит).
Может быть, когда ты переворачиваешь изображение, у тебя слетает PixelFormat?. Попробуй открыть перевернутый файл фотошопом, если ругнется, то я прав (Paint откроет легко, это не показатель).
Еще, вероятно будет полезно выставить Bitmap.HandleType:=bmDIB;


 
Martyn   (2002-04-02 16:13) [8]

для Vogul:
поворот изображения на 90 градусов по часовой стрелке - это очень просто, процедура занимает немного строк кода:

procedure RotateBmp(FileName : string);
var
Bmp, Tmp : TBitmap;
x, y : LongInt;
begin
Bmp := TBitmap.Create;
Tmp := TBitmap.Create;
Bmp.LoadFromFile(FileName);

Tmp.Height := Bmp.Width;
Tmp.Width := Bmp.Height;

tmp.Palette := Bmp.Palette;
tmp.PixelFormat := Bmp.PixelFormat;

for y := 0 to Bmp.Height - 1 do
for x := 0 to Bmp.Width - 1 do Tmp.Canvas.Pixels[Tmp.Width - 1 - y, x] := Bmp.Canvas.Pixels[x, y];

Tmp.SaveToFile(FileName);
Tmp.Free;
Bmp.Free;

end;


т.е. изображение в файле на диске поворачивается на 90 градусов, работает довольно таки быстро...:)))

для Безумной Рыбки:
Использовать QReport не могу в данном случае по одной причине - если создавать QReport, а затем QReport.Print, то при печати 100-150 наименований принтер воспринимает печать каждого из них как отдельное задание и печать идет по одному листу и очень медленно.

Вопрос в том, чтобы в канве принтера сформировать одно задание, состоящее из 100-150 наименований и выбросить его на печать, тогда достигается использование быстродействия принтера 6 страниц в минуту...

Попробую сейчас то, что ты предложил.


 
Alx2 ©   (2002-04-02 16:30) [9]

>Martyn (02.04.02 16:13)
Почему надо разворачивать изображение? Может, легче изменить ориентацию бумаги?

По поводу чистых листов...
Попробуй для эксперимента размер BitMap дать раза в четыре меньше и распечатать. Может, все-таки ограничение на размер есть?


 
Martyn   (2002-04-02 16:47) [10]

для Alx2:

Изображение приходится разворачивать потому, что все сертификаты отсканированы в А4 Portrait, когда их четное число, то на одном листе с ориентацией LandScape располагается по два сертификата, уменьшенных до половины листа и сохраняется пропорциональность изображения. А если нечетное число сертификатов, то третий, пятый, седьмой и т.д. надо печатать в оригинальном формате, т.е. А4, но в процессе печати невозможно поменять ориентацию бумаги, поэтому приходится поворачивать изображение, переводя его из А4 Portrait в А4 LandScape, для сохранения пропорций.

Попробую, что предлагаешь.


 
Alx2 ©   (2002-04-03 12:51) [11]

Ну как?


 
REA   (2002-04-03 14:51) [12]

Я работал с печатью и выяснил, что в Delphi 5 (в шестом еще не сравнивал) нет нормальной функции печати картинок (включая StretchDraw). Передрал код борланда из PrintForm (или что-то в этом роде), который юзает апи напрямую. Тоже работает криво и не всегда. Кроме того разные принтеры сообщают о себе разную информацию о поддерживаемых функциях и очень часто врут.



Страницы: 1 вся ветка

Текущий архив: 2002.04.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
1-46377
Swinger
2002-03-29 21:42
2002.04.15
Размер программы


14-46502
Андрей Сенченко
2002-03-05 17:33
2002.04.15
Компоненты для архивации


6-46478
ECM
2002-02-02 01:03
2002.04.15
Функция InternetDial(…) под Win2K


1-46422
Valentain
2002-04-02 19:30
2002.04.15
RichEdit1 -> RichEdit2 без потери качества...


1-46325
QWest
2002-04-02 17:49
2002.04.15
Где ошибка?