Форум: "Основная";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];
ВнизВопрос по печати 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c