Bilder bearbeiten ( gif / jpg ), PNGobject Problem



  • Ich weiss nicht was du willst:

    Willst du nun PNG und die Probleme damit lösen?

    Willst du nun eine GIF Komponente (kann ich dir zumailen)

    Willst du nun deine JPG Probleme lösen -> darauf bezog sich mein Kommentar: Unter Windows sind Pfade mit Backslashes zu kennzeichnen

    C:\WINDOWS\system32\drivers\etc

    und in einem Programm ist dann mit

    C:\\WINDOWS\\system32\\drivers\\etc

    zu arbeiten.

    Das ist falsch

    JPEGImage->LoadFromFile**("c:/001.jpg"**);



  • Zum ersten Christian, ist es nicht falsch.

    Das einzige, was dabei ein Problem darstellt, ist das wenn du Funktionen anwenden möchtest, die z.B. den Verzeichnissnamen auslesen wollen. Diese erkennen den Pfad dann nicht richtig.

    Christian wenn du nichts anderes zu bemängeln hast, als diesen in diesem Falle Unfug, dann lass es doch bitte bleiben. Ich brauche weder eine Komponente, die Frage steht oben beschrieben, das Problem auch. Ich denke, du hast sowieso beides nicht gelesen.

    As a TGraphic descendent, TPngObject supports assigning from and to TBitmap. As an intermediary class, TBitmap talks to most (if not all) other formats such as metafiles, icons, jpgs among others

    Dies hab ich aus den Docs. Jedoch schlägt jeder Typecast fehl. Pngimage::TBitmap, Windows::TBitmap und Graphics::TBitmap existieren.

    Ich kann zwar ein Object Pngimage::TBitmap erzeugen, dieses ist jedoch "leer";
    Ich kann zwar ein Object Windows::TBitmap erzeugen, dieses ist jedoch ein ganz anderer Objecttyp.
    Ich kann zwar ein Object Graphics::TBitmap erzeugen, dieses implementiert die gewünschten Methoden, ist jedoch nicht mit TPNGobject kompatibel.

    Könnten es Probleme mit durch TGIFimage veränderte Klassen sein, ich glaube, da noch was im Gedächtniss zu haben

    Danke dir



  • die Frage steht oben beschrieben, das Problem auch. Ich denke, du hast sowieso beides nicht gelesen.
    

    Zum ersten Christian, ist es nicht falsch. -> leider doch

    Erstaunlich woher du deine Erkenntnis nimmst, aber klar, ich habe das Problem nicht erkannt, also drücke weiter schön F5 und immer daran denken:

    Wir leben alle unter dem selben Himmel, haben aber nicht den gleichen Horizont.

    Bye



  • Christian ich sehe ja ein das du helfen möchtest, aber du willst wohl gleichzeitig provozieren, wenn man sich all deine Posts dieses Forums anschaut.

    Damit du endlich wieder ruhig schlafen kannst:

    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);
    

    Funktinioniert, wie erwarten, nicht, da es in keinster Weise nur irgenetwas mit dem Compilerfehler zu tun hat. ( Geschweigedenn, dass der Slash jemals einen Compilerfehler abwirft).

    Also tu uns allen ein gefallen, lass gut sein





  • 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.



  • 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 ?
    Indy10

    Kontest 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
    bellow

    Also, 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 werden

    Danke 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 ist

    Ich 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


Anmelden zum Antworten