Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа? / 5 сообщений из 5, страница 1 из 1
17.02.2021, 09:27
    #40046079
Snickbw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?
Ситуация : всплыла задача распечатать картинки 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
17.02.2021, 09:50
    #40046084
iStrannik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?
Все работает проверил в 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
17.02.2021, 10:00
    #40046088
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?
Snickbw,
это одна из самых дебильных "фич" VCL.
Если в Picture НЕ TBitmap, то запрос Image.Picture.Bitmap удаляет все содержимое. У тебя, насколько я понимаю, там TJPEGImage.

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

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

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


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


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


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