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/)
-   -   DBImage mit printpdf darstellen (https://www.delphipraxis.net/62523-dbimage-mit-printpdf-darstellen.html)

tom_po 5. Feb 2006 22:50


DBImage mit printpdf darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mit diesem Code hole ich mir ein Image (Bitmap) aus meiner DBisam-DB in meine Form:

Delphi-Quellcode:
dbisamquery2.SQL.Text:='select image from artplan where artigo='+quotedstr(trim(artikel.Text));
dbisamquery2.ExecSQL;
Ich habe ein pdf-Tool zum Darstellen meiner Daten im pdf-Format, wende es schon erfolgreich an. Ich exporte in's pdf schon Barcode, Memo usw
Habe aber jetzt Probleme beim Image mit diesem Code:

Delphi-Quellcode:
printpdf1.draw(100,100, dbimage1.Picture.Bitmap);
es gibt diese Meldung:

[Fehler] AknUni.pas(269): Inkompatible Typen: 'TImage' und 'TBitmap'

Tim Young von Dbisam hat mir dies gemailt:
This is really an issue for the TPrintPDF vendor, but you should be able to
cast the TDBImage to a TImage to get the desired result (TDBImage descends
from TImage)

Habe auch schon das probiert:

Delphi-Quellcode:
Image:=TImage.Create(dbimage1);
Image.Picture.Bitmap.Create;
printpdf1.ImageOut(100,200,TImage(Image));
kompiliert zwar, aber beim Anwenden kommt dann ne Fehlermeldung über Exception, siehe Bild

es wird dann auf die letzte Zeile meiner tnpdf-Unit hingewiesen:
Delphi-Quellcode:
SetBitmap(ABitmap.Picture.Bitmap);
das feld "image" hat in meiner DBIsam-Tabelle den DataType "graphic", musste nach Angaben von Tim Young von DBisam als bmp abgespeichert werden.
Die Komponente in meiner Form ist DBImage.


Wer kann helfen?

marabu 6. Feb 2006 08:39

Re: DBImage mit printpdf darstellen
 
Herzlich willkommen in der Delphi-PRAXiS.

Wenn die Methode Draw() der Komponente PrintPDF ein Image als letzten Parameter erwartet, dann sollte das prinzipiell so funktionieren:

Delphi-Quellcode:
var
  img: TImage;
begin
  img := TImage.Create(nil);
  try
    Image.Picture.Bitmap.Assign(DBImage.Picture.Bitmap);
    printpdf.draw(100,100, image);
  finally
    img.Free;
  end;
end;
DBImage ist kein Nachfahre von TImage, wovon man sich durch einen Blick in die Vererbungshierarchie (Online-Hilfe) leicht selbst überzeugen kann.

Freundliche Grüße vom marabu

tom_po 6. Feb 2006 11:47

Re: DBImage mit printpdf darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Malibu, zunächst herzlichen Dank, dass Du auf mein Problem antwortest, bin sehr froh darüber, da ich noch Anfänger bin...

Habe Deinen Code mal probiert, leicht geändert (image>>img und dbimage in dbimage1):

Delphi-Quellcode:
procedure Takn.Button3Click(Sender: TObject);
var img: Timage;
begin
 img := TImage.Create(nil);
  try
    Img.Picture.Bitmap.Assign(DBImage1.Picture.Bitmap);
    printpdf1.draw(100,100, img);
  finally
    img.Free;
  end;
end;
kompiliert schön, aber beim Ausführen bekomme ich wieder die CPU-Meldung, siehe Anhang.
Woran liegt das, was meinst Du?

marabu 6. Feb 2006 14:30

Re: DBImage mit printpdf darstellen
 
Hallo.

Ich vermute dass der Fehler beim Aufruf von PrintPDF.Draw() auftritt. Entweder die Komponente befindet sich nicht im richtigen Zustand, oder du verwendest die Methode eventuell falsch. Gibt es eine öffentlich zugängliche Dokumentation der Komponente? Ist die Komponente OpenSource oder kommerziell? Vielleicht gibt es eine Trial-Version? Hast du einen URL?

Wenn du eine Dokumentation besitzt, dann prüfe nochmal gewissenhaft, welchen Typ und welche Bedeutung der dritte Parameter der Methode Draw() hat.

marabu

tom_po 6. Feb 2006 14:53

Re: DBImage mit printpdf darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Marabu, die Komponente ist free (Nishita), hänge ein readme an, siehe auch hier der verwendete Code, auch die Procedure imageout, die ich auch schon testete, aber denselbe Exception (nullpointer) bekomme:

Delphi-Quellcode:
procedure TPrintPDF.Draw(X, Y: Integer; ABitmap:TImage);
begin
ImageOut(X, Y, ABitmap);
end;


procedure TPrintPDF.ImageOut(X, Y: Integer; ABitmap:TImage);
var tempsx,tempsy:double;
begin

tempsx:=((PageWidth)/(WinProcs.GetDeviceCaps(GetDC(0), LOGPIXELSX)*10.625));
tempsy:=((PageHeight)/(WinProcs.GetDeviceCaps(GetDC(0), LOGPIXELSY)*8));

NumberofImages:=NumberofImages+1;
StreamWriteStr(sTempStream,'q');
StreamWriteStr(sTempStream,IntToStr(trunc(ABitmap.Picture.Bitmap.Width*tempsx))+
' 0 0 '+IntToStr(trunc(ABitmap.Picture.Bitmap.Height*tempsy))+
 ' '+IntToStr(X)+' '+IntToStr(PageHeight-Y-trunc(ABitmap.Picture.Bitmap.Height*tempsy))
 +' cm');
StreamWriteStr(sTempStream,'/Im'+IntToStr(NumberofImages)+' Do');
StreamWriteStr(sTempStream,'Q');
SetBitmap(ABitmap.Picture.Bitmap);
end;
Auf Wunsch schicke ich Dir gerne die .pas per Mail zu, dazu würde ich deine e-mail haben, danke nochmals für Deine Hilfe.

marabu 6. Feb 2006 15:06

Re: DBImage mit printpdf darstellen
 
Sieht aus, als ob du alles richtig machst. Hast du die Methoden Draw() bzw. ImageOut() jemals erfolgreich eingesetzt?

Wenn du möchtest, dann zippe die PrintPDF-Komponente und stelle sie hier ein. Falls ich gleich vom Stuhl kippe, dann kann so auch jemand anders dir weiter helfen.

marabu

tom_po 6. Feb 2006 17:44

Re: DBImage mit printpdf darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hahahah, wollen wir doch hoffen, dass du dich noch lange auf deinem Stuhl hälst....

anbei die gezippte Komponente inkl. eines Beispiels...mir gefällt die Komponente. Sie hat auch bisher bestens geklappt, habe Text, Memobox, Barcode schon erfoglreich gedruckt, auch schon ein Bild, aber ein TImage mit der Eigenschaft Bitmap, noch kein TDBImage!

Schicke ein Screenprint vom TImage Code im nächsten Posting, weiss nicht, ob man 2 Anhänge hier gleichzeitig machen kann...

Vielleicht bringst du es doch hin, dass ich mein DBImage noch drucken kann, wäre prima.

tom_po 6. Feb 2006 17:45

Re: DBImage mit printpdf darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
hier das Bild von TImage code

marabu 6. Feb 2006 18:40

Re: DBImage mit printpdf darstellen
 
In der Unit TNPDF brauchst du im interface part diese Definition:

Delphi-Quellcode:
{$IFDEF VER150}
  {$DEFINE DFS_DELPHI_3_UP}
{$ENDIF}
marabu

tom_po 6. Feb 2006 18:46

Re: DBImage mit printpdf darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
mensch marabu, es klappt!!!!!!!!!!!!!bin happy, konnte zum ersten Mal das Bild darstellen.....

VIIIIIIIIIIEEEEEEEEEEEEELEN DAAAAAAAAAAAAAAAAAAANK !!!!!!!!!!!


nur noch ein Problem, es ist nach oben und unten in die Länge gezerrt....schau mal

tom_po 6. Feb 2006 18:48

Re: DBImage mit printpdf darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
hier das Originalbild, ein ScreenPrint von meiner Delphi-application

tom_po 6. Feb 2006 18:51

Re: DBImage mit printpdf darstellen
 
Hab's jetzt mal noch mit den anderen 2 Print-Procedures probiert. Funktioniert immer jetzt der Ausdruck, aber bei allen 3 Formen ist das Bild in die Länge verzerrt!

Delphi-Quellcode:
begin
 img := TImage.Create(nil);
  try
    Img.Picture.Bitmap.Assign(DBImage1.Picture.Bitmap);
    printpdf1.ImageOut(100,1100,Img);
    //printpdf1.ImageOut(100,1100,TImage(Img));
    //printpdf1.draw(100,1050, img);
  finally
    img.Free;
  end;
end;
Hast du noch ne Idee? Hat es mit dem Font zu tun? Hier der Font, den ich kurz vorher für die Memo verwende, die beim Ausdruck noch vor dem Bild kommt:

Delphi-Quellcode:
printpdf1.Font.Name:=poHelveticaBold;
printPDF1.Font.Size:=20;
printPDF1.MemoOut(50,940, Memo1);
Wie findest du ansonsten die tnpdf-Komponente?

Mit deinem Verlaub, sende ich an Nishita diesen Hinweis, er bittet ja in seinem Readme-File um Verbesserungen seiner Komponente. Ist dies ok für Dich, Marabu?

marabu 6. Feb 2006 19:08

Re: DBImage mit printpdf darstellen
 
Das Polo Shirt sieht ja aus, als wäre es bei 3.000 Umdrehungen geschleudert worden. Allerdings bevorzuge ich Hemden mit Überlänge. Wenn es wirklich dasselbe Shirt sein sollte, dann vermute ich, dass PrintPDF mit anderen Auflösungen arbeitet, als der Bildschirm. Ich könnte mir vorstellen, dass eine Vorbehandlung des Bildes im Hinblick auf die Ausgabe dem Effekt gegensteuern könnte. Und was die drei Zeilen für Nishita angeht - ich bin mir fast sicher, er wird kurz lächeln, wenn er deine Nachricht liest. Meinen Segen hast du.

Freundliche Grüße

marabu

tom_po 6. Feb 2006 19:16

Re: DBImage mit printpdf darstellen
 
Habe mich gekrümmt vor Lachen, jetzt wäre fast ich vom Stuhl gefallen...

Warum soll Nishita lachen? mal im Ernst...es hat ja gefehlt und zu dem nullpointer-Exception geführt...
Ok, bin halt noch totaler Laie...

Würdest du eigentlich das printpdf1.draw dem printpdf1.imageout vorziehen? beides funktioniert anscheinend gleich, das heisst der heisse Waschvorgang verzieht bei beiden das Polo!!
Was ist der Unterschied zwischen beiden procedures?

tom_po 6. Feb 2006 19:26

Re: DBImage mit printpdf darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
habe jetzt das Bild aus der Datenbank auf die Hälfte "zusammengestaucht" und dann ein einigermassen passables Ergebnis bekommen.

Jedoch für den Anwender gefällt mir die Lösung noch nicht...

kann man das im tnpdf nirgendwo beeinflussen?

marabu 6. Feb 2006 19:33

Re: DBImage mit printpdf darstellen
 
Lachen wird Nishita wahrscheinlich nicht - aber lächeln. Wenn er noch was mit Delphi macht, dann weiß er, dass diese Zeilen Fehlen. Ich habe durch das einfügen nur dafür gesorgt, dass der fehlerfreie Zweig in SetBitmap() durchlaufen wird. Und Draw() ist nur eine Kapsel für ImageOut() - vielleicht war der Autor etwas unentschlossen bei der Namensgebung und hat dann einfach beides vorgesehen. Nimm ImageOut() und spare ein paar CPU-Zyklen.

Was die Vorbehandlung des Bildes angeht, so solltest du die Pixeldichte ermitteln und ins Verhältnis setzen. Vielleicht nützt dir dabei StretchBlt() - schau mal in die Online Hilfe zum Win32 SDK. Da gibt es auch Kapitel zum Stretchen von Bildern. Oder suche mal hier in der DP.

marabu

Ralf Stehle 9. Mär 2006 23:39

Problem mit der Bildauflösung: DBImage mit printpdf
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich weiß nicht ob sich noch jemand mit dem Thema beschäftigt. Ich habe die vorherigen Beispiele getestet und bin ganz glücklich mit Twain und printpdf ein Programm zu erstellen, welchese Textdokumente einscannt und als PDF speichert

Nur: je nach gewählter Auflösung beim Scannen passt das Bild nicht mehr in die DinA4-Seite.

Ich habe herausgefunden, dass diese Funktion die Größe berechnet. Was muss ich tun, damit hier immer eine DinA4-Seite herauskommt?

Delphi-Quellcode:
procedure TPrintPDF.ImageOut(X, Y: Integer; ABitmap:TImage);
var tempsx,tempsy:double;
begin

tempsx:=((PageWidth)/(WinProcs.GetDeviceCaps(GetDC(0), LOGPIXELSX)*8));
tempsy:=((PageHeight)/(WinProcs.GetDeviceCaps(GetDC(0), LOGPIXELSY)*10.625));

NumberofImages:=NumberofImages+1;
StreamWriteStr(TempStream,'q');
StreamWriteStr(TempStream,IntToStr(trunc(ABitmap.Picture.Bitmap.Width*tempsx))+
' 0 0 '+IntToStr(trunc(ABitmap.Picture.Bitmap.Height*tempsy))+
 ' '+IntToStr(X)+' '+IntToStr(PageHeight-Y-trunc(ABitmap.Picture.Bitmap.Height*tempsy))
 +' cm');
StreamWriteStr(TempStream,'/Im'+IntToStr(NumberofImages)+' Do');
StreamWriteStr(TempStream,'Q');
SetBitmap(ABitmap);
end;
Ralf


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 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