Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-46543
skywalker
2002-02-14 14:01
2002.04.15
Как получить список запущенных приложений?


3-46267
zks
2002-03-26 09:24
2002.04.15
Мастера мне нужно ваше мнение.


1-46435
Gayrus
2002-04-03 03:25
2002.04.15
Help me


3-46296
Good Man
2002-03-22 19:37
2002.04.15
Как в при коннекте к БД, через ADO определить роль пользователя?


3-46289
VID_IP
2002-03-26 14:45
2002.04.15
Проблема с ADOExpress





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский