Bilder bearbeiten ( gif / jpg ), PNGobject Problem



  • Ich möchte auf Bilder ein bestimmtes Logo setzen, benutze BB5 personal.
    Bisher habe ich GIFImage verwendet um dieses Logo transparent auf das Foto zu legen. Dies ist leider qual. sehr niedrigwertig und ich bekomme komische schwarze konturen (Benutze StretchDraw um das Gif auf das Foto zu zeichnen).

    Hat jemand Erfahrungen mit anderen, besseren Komponenten, mit denen man solche Arbeiten besser/ hcohwertiger verrichten kann.

    Nützlich wären natürlich freie Komponenten, da das Programm kommerziell eingesetzt werden soll. Dieses Logo "aufsetzen" ist in keinem Falle zentraler Punkt des Programms, das Prgramm ist auch keine Bildbbearbeitungssoftware, so dass viele Lizenzen sich nutzen lassen.
    Wenn es jedoch keine alternativen geben sollte, wären natürlich kostenpflichtig ( günstige 🙂 Komponenten ein guter Rat.

    Vielen Dank



  • TPNGObject -> http://pngdelphi.sourceforge.net/

    Sehr gute Komponente, flüssige Integration in TImage, TPicture und TGraphik, gute Resultate bei StretchDraw.

    Damit kannst du komplette 32bit-Alphachannel-PNGs verwenden. Ich benutze die Komponente seit Jahren und habe noch keine bessere gefunden!



  • Kling ja wirklich intressant,

    ich sehe, dass es sich dabei im PNGs handelt.
    Die Frage ist, ob ich damit auch JPEGs einlesen kann?
    Im endeffekt geht es bei mir gerade auf dem wege, dass ich die JPEGs mit TJEPG einlese, gifs mit TGIFimage, und dann anfange dort das Logo aufzusetzen. Zielformat war bisher immer JPG, bin jedoch sicherlich nicht abgeneingt von PNGs, da sie mitlerweile ja breit unterstützt werden und auch noch frei sind.

    Danke



  • JPEG einlesen kannst du damit nicht, aber dafür hast du ja schließlich (wie du ja schon sagtest) TJPEGImage 😉

    Wie gesagt: PNG bietet dir alles, was du von GIF und JPEG gewohnt bist, und noch viel mehr! Und das Verlustfrei. Lediglich wenn du mit GIF-Bildern animationen machen willst, bist du bei PNG (noch) falsch, aber da ist auch GIF nicht das gelbe vom Ei ...



  • Du hast völlig recht, soweit bin ich auch super zurecht gekommen.
    Alles ordentlich eingebunden und es sieht auch alles genau so aus, wie ich es gewohnt bin.

    Dennoch scheitere ich bei diesem Versucht, obwohl er auch so in der Hilfe beschrieben ist :

    TJPEGImage *JPEGImage = new TJPEGImage;
    	JPEGImage->LoadFromFile("c:/001.jpg");
    	Graphics::TBitmap *tmp = new Graphics::TBitmap();
    	tmp->Assign(JPEGImage);
    
    	TPNGObject *png = new TPNGObject();
    	png->LoadFromFile("c:/001.png");
    	tmp->Canvas->Draw(0, 0, png);
    	JPEGImage->Assign(tmp);
    
            JPEGImage->SaveToFile("c:/ready.jpg");
    

    Er meint, das er TPNGobject nicht zu TGraphic convertieren kann. Hast du eine Idee, wieso das nicht funktioniert ?

    Vielen Danke



  • Nur damit du mich hoffentlich richtig verstehst :

    Ich muss über ein JPEG iregdnwie ein Transparentes logo bekommen. Das Logo kann im PNG oder gif format vorliegen, das wäre egal. Dieses Logo sollte mit stretch möglichst qualitativ auf das JPEG kommen.

    Vielen Dank



  • Da erste wäre schon mal das in Pfadangaben Backslashes verwandt werden und diese aus bekannten Gründen doppelt angegeben werden müssen



  • Christian211 schrieb:

    Da erste wäre schon mal das in Pfadangaben Backslashes verwandt werden und diese aus bekannten Gründen doppelt angegeben werden müssen

    Ich sehe nur slashes ? Was hat dein schöner Satz mit meine Problem zu tun ?

    Ich denke, dass das Problem schon beim installieren auftritt. Dort kann ich im package schon nicht PNGextras.pas mit installieren, da er in der Zeile :

    Canvas.Draw(ImagePos.X, ImagePos.Y, Image);

    Mein das TGraphics und TPNGObject nicht kompatibel seien. Eben dieser Fehler tritt bei mir ja dann auch im Code später auf ( ohne installiertem pngextra ).

    Wäre super, wenn jemand abhilfe weiss, ich hänge etwas fest.

    Auf gut Deutsch : Typecast von TPNGobejct zu TGraphic schlägt fehl.

    Vermutung : Probleme mit dem Namespace ?

    Danke



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


Anmelden zum Antworten