Bilder bearbeiten ( gif / jpg ), PNGobject Problem
-
Reyx schrieb:
Wenn du ein TGraphic brauchst, bist du dann nicht mal auf die Idee gekommen, TPNGObject::Graphic auszuprobieren?
Und zu den Backslashes: Es ist nicht falsch, Slashes zu nehmen. Das einzige falsche währe, einfache Backslashes zu verwenden, alles andere ist vollkommen in Ordnung.
Danke Reyx.
Man muss jedoch aufpassen, die ganzen "ExtractFileName, Dirname" etc Funktionen funktionieren nur mit 2x\, was in diesem Beispiel absolut belanglos ist.
Ich folgte nur dem Beispiel der Docs, ein PNG über ein anderes Image zu zeichnen
Ist zwar Deplphi/Pascal, die Logik bleibt jedoch
procedure PNGOverJPG(InJPG, InPNG: String; OutJPG: String); var JPG: TJPEGImage; BMP: TBitmap; PNG: TPNGObject; begin {Creates and loads the input images} JPG := TJPEGImage.Create; JPG.LoadFromFile(InJPG); BMP := TBitmap.Create; BMP.Assign(JPG); PNG := TPNGObject.Create; PNG.LoadFromFile(InPNG); {Draws over the bitmap (containing the JPG)} BMP.Canvas.Draw(0, 0, PNG); {Assigns back to the JPG} JPG.Assign(BMP); {Saves the JPG} JPG.SaveToFile(OutJPG); {Free the images} JPG.Free; BMP.Free; PNG.Free; end;
** Antowrt falsch verstanden **
TPNGobject->Graphic ala logo->Graphic existiert bei mir nicht! ( habe schon vorher danach geschaut gehabt).Hab ich irgendetwas falsch installiert / falsche SRCs / falsche Version ( 1.53 )
Kannst du vielleicht einfach ein Beispiel geben ? JPG öffnen, PNG drüberzeichen, JPEG speichern.
Also mit TGIFimage habe ich es früher genau so gemacht, wie sie es in der Hilfe beschreiben. Damit konnte ich dann Bilder verschiedene Formats "kombinieren".Danke
-
Sorry, da habe ich vorschnell geantwortet.
TPNGObject hat natürlich keine Member-Instanz Graphic sondern ist TGraphic abgeleitet
Allerdings verstehe ich dann nicht, warum er bei dir TPNGObject nicht als TGraphic auslegen kann?
Wo genau tritt der Fehler in deinem Quellcode auf? Per Draw-Methode müsste das funktionieren (habe ich übrigens genau so auch schon oft gemacht) ...
-
Reyx schrieb:
Sorry, da habe ich vorschnell geantwortet.
TPNGObject hat natürlich keine Member-Instanz Graphic sondern ist TGraphic abgeleitet
Allerdings verstehe ich dann nicht, warum er bei dir TPNGObject nicht als TGraphic auslegen kann?
Wo genau tritt der Fehler in deinem Quellcode auf? Per Draw-Methode müsste das funktionieren (habe ich übrigens genau so auch schon oft gemacht) ...Also ich hab einfach ein neues Projekt begonnen.
Der Code den ich geposted habe, ist der einzige.
Unit1.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { TPNGObject *logo = new TPNGObject(); logo->LoadFromFile("c:\\001.png"); TJPEGImage *JPEGImage = new TJPEGImage; JPEGImage->LoadFromFile("c:\\001.jpg"); Graphics::TBitmap *tmp2 = new Graphics::TBitmap(); tmp2->Assign(JPEGImage); tmp2->Canvas->Draw(0,0,logo->Graphic); }
Unit1.h
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <pngimage.hpp> #include "jpeg.hpp" //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
Fehler in Zeile (tmp2->Canvas->Draw(0,0,logo->Graphic);)
[C++ Fehler] Unit1.cpp(30): E2316 'Graphic' ist kein Element von 'TPNGObject'
Wie gesagt, ich hatte schon Problem, pngextras.pas zu installieren, da er mir wie im obigen Post beschrieben, an einer bestimmen stelle eine Fehler bringt, eben das TGraphic und TPNobject nicht komp. seien. Ich habe pngextras.pas dann einfach weggelassen.
Danke dir
-
TPNGObject *logo = new TPNGObject(); logo->LoadFromFile("c:\\001.png"); TJPEGImage *JPEGImage = new TJPEGImage; JPEGImage->LoadFromFile("c:\\001.jpg"); Graphics::TBitmap *tmp2 = new Graphics::TBitmap(); tmp2->Assign(JPEGImage); tmp2->Canvas->Draw(0,0,logo);
Das kompiliert bei mir problemlos.
-
-Welche Version benutzt du denn ?
Ich habe 1.53 mit dem Borland Builder 5 personal ( inkl offiziellem Patch )-Benutzt du GIFimage?
Habe ich( in diesem Projekt jedoch nicht
-Hast du Indy installiert ?
Indy10Kontest du das gesamht PNGimage packet installieren ? Wie hast du es installiert ? ala docs ?
The component also can be installed on Borland C++ Builder. To do so, follow these steps:
First of all, copy (unzip) all the files to any directory. The obj sub-directory is necessary to install the component.
Run a Borland C++ Builder instance
Select the menu File and then the item New.
Item the new dialog, choose the Package item (as shown bellow) and press the OK button.In the new package item, press the Add button on the Toolbar
Now press the Browse button located in the first tab, Add Unit. As shown bellow:You will choose now the files to add the package. To do so:
Choose the filter Pascal Unit (*.pas)
Browse for the folder where the Png Delphi files are located
Select the files PngImage.Pas, PngLang.Pas, PngZlib.Pas, PngExtra.Pas ()
(multiple select by clicking using the CTRL key pressed)
Press open
Press Ok to close the Add window
Back to C++ Builder window, choose the File menu, and the item Save As...
Save the file using any name (ex: pngbuilder.dpk), a good idea is to save in the
same folder as Png Delphi files.
Press the install button on the Package window to install the component as shown
bellowAlso, adding the unit to the search path is a good idea
This time, go to the "Tools" menu and select the item "Enviroment Options".
Click on the "Library" page.
On the field "Library path" add a ";" followed by the unit directory. For instance ";c:\png".
Click on the ok button.Wenn ich PNGimage mit pngextra.pas compiliere, passiert folegdens.
FEhler in Zeile ( Canvas.Draw(ImagePos.X, ImagePos.Y, Image); )
[Pascal Fehler] pngextra.pas(208): Inkompatible Typen: 'TGraphic' und 'TPNGObject'
[Pascal Fataler Fehler] pasall.tmp(6): Verwendete Unit 'D:\dev\Projekte\IEOGalerie\PNGtest\pngimage153\pngextra.pas' kann nicht compiliert werdenDanke dir
-
Ich benutze die Version 1.5 von im Builder 6 Personal. Installiert habe die die Komponenten einfach, indem ich die pngimage.pas in ein neues Package geladen, kompiliert und installiert habe. Vorher hatte ich noch die Sprache der Komponente auf Deutsch umgestellt, aber das sollte nicht viel zu Sache beitragen
Sollte auch nicht viel damit zu tun haben, aber ich habe Indy 8 installiert.
-
Könntest du mir die Version an splivf AT gmx DOT de senden?
Ich würde es einfach probieren.
Wie meinst du das, in eine "neues" Projekt laden ?
Danke
-
File->New-Package
Dann "Add" und die pngimage.pas auswählen. Dann "Compile" und dann "Install". Dass sollte eigentlich ohne Fehler kompilieren.
Ob du mit der Version 1.5 etwas anfangen könntest, weiß ich nicht. Ich habe mal in die besagte pngextras.pas geguckt und da steht bei mir genau das gleiche wie bei dir drin.
Probier mal den Weg über ein neues Package, wenn das auch nichts bringt -> https://sourceforge.net/project/showfiles.php?group_id=16012
-
Ich hab das ja genau so gemacht, also sind unsere Wege gleich.
Kannst du denn die neue 1.53 Version kompilieren ohne Fehler ?
-
Kann ich dir gerade leider nicht sagen, ich sitze hier gerade an einem Produktionscomputer und da gilt: Never touch a running system!
Wenn ich später dazu komme, sag ich dir bescheid!
Hast du wirklich nur die pngimage.pas in dein Package getan oder auch alle anderen Dateien? Falls letzteres, probier es mal ohne die. Allerdings hört sich das für mich allmählich eher wie ein Bug im Builder an (hat der ja gerne mal). Wie lange arbeitest du schon mit dem? Ansonsten könnte vllt. eine Neuinstallation etwas bringen, das aber erst als letzte Maßname!
-
Builder ist sehr frisch, maximal 1 Monat, erstes "vorhandenes" Projekt hier auf dem Laptop angefangen.
Ich werde, solange du noch nicht zuhause bist, mal die Scanline methode testen und dann wohl oder übel den Builder mal neu installieren.
Danke für deine Hilfe!
-
Also mit der ScanLine Methode hat es nicht funtioniert, dann bleibt mir wohl nur noch der Builder-Reinstall.
-
Hab den BB5 auf einem anderen System frisch installiert und bekomme exakt das gleiche Ergebnis..die selben Fehler.
Ich kann nicht :
- pngextra.pas kompilieren, siehe oben
- ich bekomme eine fehlermeldung, das TPNGobject nicht vom Typ TGraphic istIch weiss wirklich nicht mehr weiter, jemand einen schimmer ?
Vielen Dank
-
Ok ich habe den Fehler "gefunden".
Es liegt tatsächlich an der Version, mit der Version 1.50 funktiniert es im BB5 pers ohne Problem, Version 1.53 von PNGimage jedoch nicht.
Schlage vor, man nimmt das in die FAQs unter PNG auf, das man hier aufpassen muss.
Wäre klassen, wenn jemand mit einer anderen Version des Builders dies testen / bestätigen könnte.Beide Versionen gibt es unter pngdelphi.sourceforge.org