powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?
5 сообщений из 5, страница 1 из 1
Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?
    #40046079
Snickbw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ситуация : всплыла задача распечатать картинки jpeg из БД (1 картинка на 1 листе) их порядка 5 000 шт. Решил автоматизировать процесс, нашёл кучу примеров например такой:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
uses  
  printers;  
procedure DrawImage(Canvas: TCanvas; DestRect: TRect; ABitmap: TBitmap);  
var  
  Header, Bits: Pointer;  
  HeaderSize: DWORD;  
  BitsSize: DWORD;  
begin  
  GetDIBSizes(ABitmap.Handle, HeaderSize, BitsSize);  
  Header := AllocMem(HeaderSize);  
  Bits := AllocMem(BitsSize);  
  try  
    GetDIB(ABitmap.Handle, ABitmap.Palette, Header^, Bits^);  
    StretchDIBits(Canvas.Handle, DestRect.Left, DestRect.Top,  
      DestRect.Right, DestRect.Bottom,  
      0, 0, ABitmap.Width, ABitmap.Height, Bits, TBitmapInfo(Header^),  
      DIB_RGB_COLORS, SRCCOPY);  
  finally  
    FreeMem(Header, HeaderSize);  
    FreeMem(Bits, BitsSize);  
  end;  
end;  
procedure PrintImage(Image: TImage; ZoomPercent: Integer);  
  // if ZoomPercent=100, Image will be printed across the whole page  
var   
  relHeight, relWidth: integer;  
begin  
  Screen.Cursor := crHourglass;  
  Printer.BeginDoc;  
  with Image.Picture.Bitmap do   
  begin  
    if ((Width / Height) > (Printer.PageWidth / Printer.PageHeight)) then  
    begin  
      // Stretch Bitmap to width of PrinterPage  
      relWidth := Printer.PageWidth;  
      relHeight := MulDiv(Height, Printer.PageWidth, Width);  
    end   
    else  
    begin  
      // Stretch Bitmap to height of PrinterPage  
      relWidth  := MulDiv(Width, Printer.PageHeight, Height);  
      relHeight := Printer.PageHeight;  
    end;  
    relWidth := Round(relWidth * ZoomPercent / 100);  
    relHeight := Round(relHeight * ZoomPercent / 100);  
    DrawImage(Printer.Canvas, Rect(0, 0, relWidth, relHeight), Image.Picture.Bitmap);  
  end;  
  Printer.EndDoc;  
  Screen.cursor := crDefault;  
end;  
// Example Call:  
procedure TForm1.Button1Click(Sender: TObject);  
begin  
  // Print image at 40% zoom:  
  PrintImage(Image1, 40);  
end;



Проблема : Вроде всё компилиться, ошибок нет, НО при выполнении программы в строке (Width / Height) деление на ноль, т.к. Image.Picture.Bitmap.Height и Image.Picture.Bitmap.Width всегда оба равны 0. Какие и как ни грузи в Image файл jpeg (руками или программно или ещё как).
Вопрос : Что за косяк с Image.Picture.Bitmap.Height и Image.Picture.Bitmap.Width ?

З.Ы. пробовал XE2 и XE5 результат один и тот же.
...
Рейтинг: 0 / 0
Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?
    #40046084
iStrannik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все работает проверил в XE5.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TForm1.Button1Click(Sender: TObject);
 var
  Jpg: TJpegImage;
begin
  Jpg := TJpegImage.Create;
   try
      Jpg.LoadFromFile('E:\1.jpg');
      Image1.Picture.Bitmap.Assign(Jpg);
      // Print image at 40% zoom:
      PrintImage(Image1, 40);
   finally
     Jpg.Free;
   end;
end;

...
Рейтинг: 0 / 0
Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?
    #40046088
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snickbw,
это одна из самых дебильных "фич" VCL.
Если в Picture НЕ TBitmap, то запрос Image.Picture.Bitmap удаляет все содержимое. У тебя, насколько я понимаю, там TJPEGImage.

Оперируй только Picture.Graphic. А еще лучше - выкинь весь VCL код для графики и пользуй GDI+
...
Рейтинг: 0 / 0
Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?
    #40046118
Snickbw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
там TJPEGImage

Да, теперь въехал, что напрямую JPEG не покатит.

iStrannik
Код: pascal
1.
2.
      Jpg.LoadFromFile('E:\1.jpg');
      Image1.Picture.Bitmap.Assign(Jpg);


Согласен, это выход, налету JPEG в BITMAP
...
Рейтинг: 0 / 0
Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?
    #40046174
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snickbw,
Конверсия тут не нужна, равно как и куча другой фигни. Просто
Код: pascal
1.
Printer.Canvas.StretchDraw(...,  Image.Graphic);


А лучше шаблон FR сделать c полем рисунка. В таком виде у тебя рано или поздно кривизна при печати проявится.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]