Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Вниз

Печать картинки   Найти похожие ветки 

 
Darlock   (2003-07-22 16:49) [0]

Всем привет.

Считываю картинку из фала (JPG на 1 МБ) вывожу на печать - каринка на весь лист. Ее же печатаю из фотошопа - картина 5 на 5 см. В чем прикол? я так подозреваю что в разрешении картинки, но как мне быть что бы она и у меня печаталась 5 на 5. Спасибо


 
alextov   (2003-07-22 17:09) [1]

А каким образом ты выводишь ее на печать?


 
Anatoly Podgoretsky   (2003-07-22 17:15) [2]

Фотошоп наверно масштабирует! Тебе тоже никто не мешает.


 
Darlock   (2003-07-22 17:46) [3]

Спасибо за ответы, но:

2alextov
Printer.Canvas.Draw

Anatoly Podgoretsky
В том же ACDSee я вижу что разрешение 300х300, где посмотреть какое разрешение у TImage я не знаю, кроме того если у фотошопа получается ОЧЕНЬ качественная картинка, то у меня при выводе на печать через Pinter.Canvas.StretchDraw качество ОЧЕНЬ сильно ухудшается... Кроме того ИМХО JPEG не вектр, а растр - значит маштабировать его можно только с потерей качества, а у фотошопа этого не заметно...

Еще раз спасибо за внимание.


 
BOA_KAA   (2003-07-22 18:03) [4]

procedure TfmMain.mmPrintClick(Sender: TObject);
var
Info: PBitmapInfo;
InfoSize, ImageSize: DWord;
Image: Pointer;
begin
if not dgPrint.Execute then Exit;
Printer.BeginDoc;
GetDIBSizes(imMain.Picture.Bitmap.Handle, InfoSize, ImageSize);
Info:=AllocMem(InfoSize);
try
Image:=AllocMem(ImageSize);
try
GetDIB(imMain.Picture.Bitmap.Handle, 0, Info^, Image^);
StretchDIBits(Printer.Canvas.Handle,
0, 0, Printer.PageWidth, Printer.PageHeight,
0, 0, imMain.Width, imMain.Height,
Image, Info^, DIB_RGB_COLORS, SRCCOPY);
finally
FreeMem(Image, ImageSize);
end;
finally
( Info, InfoSize)
procedure TfmMain.mmPrintClick(Sender: TObject);
var
Info: PBitmapInfo;
InfoSize, ImageSize: DWord;
Image: Pointer;
begin
if not dgPrint.Execute then Exit;
Printer.BeginDoc;
GetDIBSizes(imMain.Picture.Bitmap.Handle, InfoSize, ImageSize);
Info:=AllocMem(InfoSize);
try
Image:=AllocMem(ImageSize);
try
GetDIB(imMain.Picture.Bitmap.Handle, 0, Info^, Image^);
StretchDIBits(Printer.Canvas.Handle,
0, 0, Printer.PageWidth, Printer.PageHeight,
0, 0, imMain.Width, imMain.Height,
Image, Info^, DIB_RGB_COLORS, SRCCOPY);
finally
FreeMem(Image, ImageSize);
end;
finally
FreeMem(Info, InfoSize);
end;
Printer.EndDoc;
imMain.Picture.Graphic);
end;


Масшабируй уже сам :-)


 
Darlock   (2003-07-23 12:24) [5]

2BOA_KAA
Хм... Что-то я не совсем понял то что вы тут написали, чем этот кусок кода отличается от Printer.Canvas.StretchDraw? Или здесь ужатие идет без потери качества?


 
Darlock   (2003-07-23 12:31) [6]

2BOA_KAA
Неусмотрел параметры ширины принтера и длины, действительно картинка выводится в нормальном размере, как и в фотошопе, только черно-белая, надеюсь это как-то можно поправить....
Спасибо


 
BOA_KAA   (2003-07-23 13:03) [7]

Нецветная? А принтер-то цветной? :-)
Кстати, предпоследняя строчка случайно попала


 
Darlock   (2003-07-31 16:37) [8]

2BOA_KAA: Все таки что-то тут не так метод описаный вами в моей интерпретации выглядит так:

GetDIBSizes(Image1.Picture.Bitmap.Handle, InfoSize, ImageSize);
Info := AllocMem(InfoSize);
try
Image := AllocMem(ImageSize);
try
GetDIB(Image1.Picture.Bitmap.Handle, 0, Info^, Image^);
Caption := IntToStr(Printer.PageWidth);
( Printer.Canvas.Handle,
0, 0, Image1.Picture.BitMap.Width*2, Image1.Picture.BitMap.Height*2,
0, 0, Image1.Picture.Width, Image1.Picture.Height,
Image, Info^, DIB_RGB_COLORS, SRCCOPY
) 2BOA_KAA: Все таки что-то тут не так метод описаный вами в моей интерпретации выглядит так:

GetDIBSizes(Image1.Picture.Bitmap.Handle, InfoSize, ImageSize);
Info := AllocMem(InfoSize);
try
Image := AllocMem(ImageSize);
try
GetDIB(Image1.Picture.Bitmap.Handle, 0, Info^, Image^);
Caption := IntToStr(Printer.PageWidth);
StretchDIBits(Printer.Canvas.Handle,
0, 0, Image1.Picture.BitMap.Width*2, Image1.Picture.BitMap.Height*2,
0, 0, Image1.Picture.Width, Image1.Picture.Height,
Image, Info^, DIB_RGB_COLORS, SRCCOPY);
...

На одном принтере он печатаеи реальный размер картинки, а на другом РОВНО в 2 раза меньше, на остальных не пробывал, мне и это не сильно ясно..

Кто-то скажет как напечатать картинку с ее истинными размерами??
Хелп плз.

Или ссылок на понятийный уровень, я просто не сильно понимаю как связать пиксели изображения с ее истинным размером, а тем более с принтером...


 
BOA_KAA   (2003-07-31 18:31) [9]

Итак,

> Кто-то скажет как напечатать картинку с ее истинными размерами??

Что понимается под "истинным размером картинки"???

> Image1.Picture.BitMap.Width*2, Image1.Picture.BitMap.Height*2,

Справочку по StretchDIBits прочитайте, pls.

StretchDIBits(Printer.Canvas.Handle,
0, 0, Printer.PageWidth, Printer.PageHeight, // Здесь идет масштабирование
0, 0, imMain.Width, imMain.Height,
Image, Info^, DIB_RGB_COLORS, SRCCOPY);


Если масштабирования не надо или надо не на весь лист, или посередине листа напечатать, или еще как нибудь поизвращаться надо просто нормально вычислить координаты угла прямоуголька рисунка на принтере.
В Вашем случае Image1.Picture.BitMap.Width, Image1.Picture.BitMap.Height. Отцентровать, надеюсь проблемы не составит. У Вас все едет именно в этой строчке. Разрешение разных принтеров разное => делайте выводы.


 
Darlock   (2003-07-31 19:02) [10]

>>Что понимается под "истинным размером картинки"???
Размер картинки с учетом разрешающей способности, моя картинка имеет размер в пикселях где-то 600х1300, а в см (при віводе на принтер) размер должен быть где-то 3х5.

>>Справочку по StretchDIBits прочитайте, pls.
Прочитал еще после первого вашего примера и как мне казалось понял суть - печать DIP Битмапа в указаную облать - что дает вохможность маштабировать. В иоем сучае маштабировать не надо, надо просто напечатать картинку с ее истиными размерами.

>>Если масштабирования не надо...
В моем примсере проставленна удвоенная величина - дабы посмотреть эффект работы на принтере на котором StretchDIBits выводило на принтер изображение в 2 раза меньшее чем должно быть.
Я так понимаю надо еще какой-то коэфициент откуда-то считать, вроде бы в Envision Image Library что-то наковырял... Щас попробую...


 
BOA_KAA   (2003-07-31 19:30) [11]

Наконец-то добрались до чего-то :-)

Тогда так.
- Узнаём размер картинки, который должен получиться в см, мм, дюймах или пр.
- Узнаем сколько это занимает в пикселях принтера (см. http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988622422&n=18)
- Масшабируем до нужного размера StretchDIBits, как уже обсудили.

Надеюсь, теперь все должно быть ясно. Удачи!


 
Darlock   (2003-08-01 10:39) [12]

Ок, примерно так я себе и представлял, спасибо, но 1 пункт - как его решить...


 
BOA_KAA   (2003-08-01 10:54) [13]

Это нужно задавать исходя из условий.
Хочешь ты фотку 3Х5 - так и задавай.


 
Darlock   (2003-08-01 12:57) [14]

2BOA_KAA: Вся фишка в том что формат фотки уже задан в самом изображении и именно таким он идолжен быть, т.с. original size, а не в том что бы я его задвал в программе. Я тут в сорцах Envision library посмотрел - не такое это уже и тривиальное задание оказалось..
:)))


 
[lamer]Barmaglot   (2003-08-01 13:08) [15]

Ну чуть переставь...

1. Узнаешь сколько размер твоей картинки в пикселях.
2.Узнаем сколько это занимает в пикселях принтера (см. http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988622422&n=18)
3. Масшабируем до нужного размера StretchDIBits, как уже обсудили.



 
BOA_KAA   (2003-08-01 13:10) [16]

Извини, не догнал: где задан размер фотки?
Партизан! Из тебя информацию надо по байту вытягивать :-)


 
Darlock   (2003-08-01 16:07) [17]

Извиняюсь за скупость информации - это не от жадности, а от того что я думал ее будет достаточно. Значитца так:

2[lamer]Barmaglot: StretchDIBits - вполне бы меня устроил если бы не одно "НО". Насколько мне известно существует такое понятие как разрешение и если разрешение картинки не совпадает с разрешением принтера, то при использовании этого метода имеем рассогласование выводимой картинки с ее Original Size (OS).

>>Извини, не догнал: где задан размер фотки?
Я его задавал в Фотошопе. Как я понимаю Пиксели по соотв. оси / разрешение по соотв оси - это и будет размер в дюймах - его можно перевести в мм. Если я правильно понимаю именно по обратной приведенной мной схеме действует фотошоп когда просит внести размер нового изобраения.

Как я понимаю суть проблемы сводится к тому что бы определить разрешение картинки, тогда:
1. Определить разрешение картинки.
2. Определить разрешение принтера.
3. Определить коефициент между DPI принтера и DPI изображения, как я понимаю - это и есть тот коеф который будет использоватья при маштабировании функцией StretchDIBits.


 
BOA_KAA   (2003-08-01 16:13) [18]

> Как я понимаю суть проблемы сводится к тому что бы определить
> разрешение картинки


Я, вроде, о том и говорил :-)
Так ты разобрался или нет?


 
Darlock   (2003-08-01 16:56) [19]

Неа, как определить разрешение картинки, а не отношение пикселей картинки к пикселям принтера?



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

Форум: "Media";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.01 c
14-90060
sancho
2003-11-05 21:48
2003.11.27
Задачка по математике


1-89836
DimaK
2003-11-16 17:45
2003.11.27
ProgressBar


9-89672
Ник М. Цов
2003-05-08 17:35
2003.11.27
Текстовый квест на Delphi - реально?


1-89947
mmmaloy
2003-11-18 01:05
2003.11.27
TreeView программно


3-89742
robert
2003-11-07 22:37
2003.11.27
помогите с sql





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский