Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?  [new]
Snickbw
Member

Откуда:
Сообщений: 443
Ситуация: всплыла задача распечатать картинки jpeg из БД (1 картинка на 1 листе) их порядка 5 000 шт. Решил автоматизировать процесс, нашёл кучу примеров например такой:
+

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 результат один и тот же.

Сообщение было отредактировано: 17 фев 21, 09:20
17 фев 21, 09:27    [22282053]     Ответить | Цитировать Сообщить модератору
 Re: Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?  [new]
iStrannik
Member

Откуда:
Сообщений: 145
Все работает проверил в XE5.

+
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;
17 фев 21, 09:50    [22282059]     Ответить | Цитировать Сообщить модератору
 Re: Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 14191
Snickbw,
это одна из самых дебильных "фич" VCL.
Если в Picture НЕ TBitmap, то запрос Image.Picture.Bitmap удаляет все содержимое. У тебя, насколько я понимаю, там TJPEGImage.

Оперируй только Picture.Graphic. А еще лучше - выкинь весь VCL код для графики и пользуй GDI+
17 фев 21, 10:00    [22282063]     Ответить | Цитировать Сообщить модератору
 Re: Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?  [new]
Snickbw
Member

Откуда:
Сообщений: 443
Соколинский Борис
там TJPEGImage

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

iStrannik
      Jpg.LoadFromFile('E:\1.jpg');
      Image1.Picture.Bitmap.Assign(Jpg);

Согласен, это выход, налету JPEG в BITMAP
17 фев 21, 11:22    [22282105]     Ответить | Цитировать Сообщить модератору
 Re: Нужна печать из Image, но у меня всегда Bitmap.Width и Height =0. Что за шляпа?  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 14191
Snickbw,
Конверсия тут не нужна, равно как и куча другой фигни. Просто
Printer.Canvas.StretchDraw(...,  Image.Graphic);

А лучше шаблон FR сделать c полем рисунка. В таком виде у тебя рано или поздно кривизна при печати проявится.
17 фев 21, 12:45    [22282173]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить