Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi bmp.assign(Image.picture) -->leeres bild???? (https://www.delphipraxis.net/110810-bmp-assign-image-picture-leeres-bild.html)

SimStar001 25. Mär 2008 09:21


bmp.assign(Image.picture) -->leeres bild????
 
Hallo,ich ahbe hier ein kleineres Problem, bei dem ich net weiterkomme!

und zwar zeichnen ich über canvas auf einem IMAGE ein Bild. Dieses will ich dann an den Drucker schicken um es zu drucken.

Dazu muss ich vorher einen bestimmten code ausführen, allerdings ist das bild dann hinterher nicht vorhanden, bzw nur weiß! speichere ich es allerdings vorher auf der Festplatte und lade es dann wieder dann klappt das ganze! hat jemand ne ahnung wieso!`?


hier der code den ich eigentlich ausführen möchte und der nicht klappt:
Delphi-Quellcode:
var pic : tjpegimage;
begin
...
pic := tjpegimage.create;
pic.assign(image1.picture.graphic);
with printer do
  begin
  ...
  strechdraw(0,0,breite,hoehe,pic);
  ...
  end;
...
end;


wer hat ne idee wieso das net klappt!

Dani 25. Mär 2008 12:20

Re: bmp.assign(Image.picture) -->leeres bild????
 
Probier mal Folgendes:

Delphi-Quellcode:
var pic : tjpegimage;
begin
...
pic := tjpegimage.create;
pic.assign(image1.picture.graphic);

//Neues TImage auf Form klatschen
Image2.Picture.Assign(Pic);
//Wenn in Image2 jetzt das Bild angezeigt wird, liegts an StretchDraw.
...
end;
Ich vermute, dass es an StretchDraw bzw. der geräteabhängigen internen Bitmap von TJpegImage liegt.

SimStar001 25. Mär 2008 13:17

Re: bmp.assign(Image.picture) -->leeres bild????
 
gut wird auf image 2 angezeigt! und waskann ich da jetzt machen?

Dani 25. Mär 2008 13:29

Re: bmp.assign(Image.picture) -->leeres bild????
 
Wahrscheinlich reicht es schon, die JPEG-Grafik aus dem TImage in eine TBitmap zu kopieren. Dann:
Delphi-Quellcode:
  ...
  TempBMP.Assign(Pic);
  TempBMP.HandleType := bmDIB;
  with Printer do begin
    ...
    Canvas.StretchDraw(R, TempBMP);
  end;
Ansonsten habe ich hier noch eine uralte Prozedur rumliegen, die (glaube ich) auch mal funktioniet hat.

Delphi-Quellcode:
procedure StretchBitmapToPrinter(TargetCanvas: TCanvas; DestRect: TRect; Bitmap: TBitmap);
var
  BitmapHeader: pBitmapInfo;
  BitmapImage: Pointer;
  HeaderSize: DWORD;
  ImageSize: DWORD;
begin
    GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);
    GetMem(BitmapHeader, HeaderSize);
    GetMem(BitmapImage, ImageSize);
    try
      GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);
      StretchDIBits(TargetCanvas.Handle,
        DestRect.Left, DestRect.Top,   // Destination Origin
        DestRect.Right - DestRect.Left, // Destination Width
        DestRect.Bottom - DestRect.Top, // Destination Height
        0, 0,                          // Source Origin
        Bitmap.Width, Bitmap.Height,   // Source Width & Height
        BitmapImage,
        TBitmapInfo(BitmapHeader^),
        DIB_RGB_COLORS,
        SRCCOPY);
    finally
      FreeMem(BitmapHeader);
      FreeMem(BitmapImage);
   end;
end;

Muetze1 25. Mär 2008 14:22

Re: bmp.assign(Image.picture) -->leeres bild????
 
StretchDraw() wird von den meisten Druckertreibern nicht unterstützt und von daher ist StretchDIBits die einzige Möglichkeit auf eine hohe Unterstützung zurück greifen zu können. Die grösste Anzahl der Druckertreiber unterstützen StretchDIBits().

SimStar001 25. Mär 2008 18:50

Re: bmp.assign(Image.picture) -->leeres bild????
 
vielen dank für die Hilfe!


Delphi-Quellcode:
...
  TempBMP.Assign(Pic);
  TempBMP.HandleType := bmDIB;
  with Printer do begin
    ...
    Canvas.StretchDraw(R, TempBMP);
  end;
...



bei diesem code hängt sich mein rechner immer auf! :wall:


achso, was ich vergessen hatte zu erwähnen, wenn ich das bild auf festplatte speichere ist es150mb groß!


und was muss ich bei dem zweite code beispiel als variablen übergeben? :wiejetzt:

kenn diese net!


dankö!

Dani 25. Mär 2008 19:48

Re: bmp.assign(Image.picture) -->leeres bild????
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

bei diesem code hängt sich mein rechner immer auf! ouch!
achso, was ich vergessen hatte zu erwähnen, wenn ich das bild auf festplatte speichere ist es150mb groß!
Das JPEG ist 150 MB groß? Was hat das denn für eine Auflösung?
Was du natürlich immer machen kannst, ist, das Bild "gekachelt" auf den Drucker auszugeben. Also immer nur ein Rechteck mit beschränkter Größe (siehe Bild). Das erfordert zwar ein bischen mehr Code, aber dir geht dann nicht mehr so schnell der Speicher aus. AFAIK müsstest du dir dafür aber noch eine andere JPEG-Komponente suchen, weiß nicht ob TJpegImage für sowas flexibel genug ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz