Bilder bearbeiten ( gif / jpg ), PNGobject Problem
-
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
-
Ansonsten schau dir das hier vom Altenburger mal an.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-135410-and-highlight-is-wasserzeichen%2A.html
-
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 ?
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!