Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Grafikformat prüfen (https://www.delphipraxis.net/171308-grafikformat-pruefen.html)

josefkoller 30. Okt 2012 20:56

Grafikformat prüfen
 
Hallo,

wie kann ich denn ein Bild auf das Format prüfen?

Die Grafik wird in eine Komponenteneigenschaft (TGraphic) geladen. Um sie auf dem Canvas darstellen zu können, müßte ich wissen welches Format dahintersteckt.

Ich bräuchte sowas, If "graphivproperty" is TPNG oder .... is TJPEG oder .... is TGIF usw.

Vielleicht kann mir jemand weiterhelfen.

Danke.

Josef

Luckie 30. Okt 2012 21:18

AW: Grafikformat prüfen
 
Die meisten Grafikformate haben einen Dateiheader. Den kannst du auslesen.

nuclearping 30. Okt 2012 21:55

AW: Grafikformat prüfen
 
Gibt auch Libs, die dir das abnehmen. Vampyre Imaging Library zB.

Popov 30. Okt 2012 22:24

AW: Grafikformat prüfen
 
Ich glaube er meint etwas einfaches. Ich komm jetzt auch nicht drauf, aber es gibt eine einfache Möglichkeit den geladenen Grafiktyp in TPicture zu ermitteln.

himitsu 30. Okt 2012 22:31

AW: Grafikformat prüfen
 
Wenn das Bild schon in TGraphic drinsteckt, dann kannst du natürlich auch direkt den Typ der Graphic-Instanz prüfen.

[edit]
Delphi-Quellcode:
(Picture.Graphic is TBitmap) = ein Bitmap
usw.
eventuell hilft auch
Delphi-Quellcode:
GetFileFormats.BuildFilterStrings(TGraphicClass(Picture.Graphic.ClassType), Descriptions, Filters);
ShowMessage(Descriptions + sLineBreak + Filters);

Bummi 30. Okt 2012 22:32

AW: Grafikformat prüfen
 
@Popov
Die Ebene TPicture liegt über TGraphic ...
Natürlich geht etwas in der Art
Delphi-Quellcode:
if image1.Picture.Graphic is TJpegImage then Showmessage('jpg')
hier scheint es aber darum zu gehen in Abhängigkeit eines zu ladenden Streams (bei einer Datei hätte man ja die Extension) die richtige Klasse für die Zuordnung zu TGraphic als Containerzu erzeugen.

himitsu 30. Okt 2012 22:41

AW: Grafikformat prüfen
 
Stimmt.

Zitat:

Die Grafik wird in eine Komponenteneigenschaft (TGraphic) geladen
Klang aber danach, daß es schon reingeladen wurde.

Nja, entweder man holt/speichert dort, von wo der Stream, bzw. das Bild kommt, auch das noch Format und schon hat man es.


Ansonsten kann man es natürlich auch auf die brutale Variante (Bruteforce) versuchen.
- alle bekannten Graphic-Typen (TBitmap, TJPegImage, ...) durchprobieren und da wo es nicht knallt, dort passt vermutlich das Bild rein. :stupid:

Sir Rufo 30. Okt 2012 22:47

AW: Grafikformat prüfen
 
Zitat:

Zitat von josefkoller (Beitrag 1189143)
Die Grafik wird in eine Komponenteneigenschaft (TGraphic) geladen. Um sie auf dem Canvas darstellen zu können, müßte ich wissen welches Format dahintersteckt.

Wieso das denn, wenn das Bild da drin ist, einfach auf den Canvas malen ...
Oder willst du noch dazu malen, was für ein Format dahintersteckt?

Popov 31. Okt 2012 03:46

AW: Grafikformat prüfen
 
Ganau das Gleiche wollte ich eigentlich auch fragen, hab mich aber nicht getraut :oops:

josefkoller 31. Okt 2012 11:44

AW: Grafikformat prüfen
 
Hallo,

vielen Dank für die Antworten.

Ich hab mal die Sachen, die diese Zeichnerei in der Komponente machen, ausgeklammert. Und siehe da: Es kommt immer noch "Abstrakter Fehler".

Dann hab ich mal die Zeichnerei in das OnPaint Ereignis eines Formulars kopiert.

//*******************************************
procedure TForm1.FormPaint(Sender: TObject);
var
ico:TIcon;
bmp:TGraphicExGraphic;
begin
try
try
bmp:=TGraphicExGraphic.create;
bmp.PixelFormat:=pf32bit;
if not (image1.Picture.Graphic is TIcon) then begin
bmp.Assign(image1.Picture.Graphic);
canvas.StretchDraw(clientrect,bmp);
end else begin
ico:=TIcon.create;
ico.Assign(image1.Picture.Icon);
canvas.StretchDraw(clientrect,ico);
end;
finally
FreeAndNil(bmp);
FreeAndNil(ico);
end;
except
Showmessage('Ungültiges Bildformat');
end;
end;

//**************************************

... und da funktioniert das Ganze.

Was mir aber auffiel:
Es wurden etliche Graphic-Filter-pas-Dateien in die uses von form1 geschrieben, je nachdem, welchen Graphic Typ ich in das Image geladen hatte.
Z.B. LMDPNGImage, jpeg.

Ich hatte die uses nur um "graphicEx" erweitert.

Mein "Abstakter Fehler" liegt wo anders in meinem Komponentencode.

Nur wo?????

Beim Kompilieren des Packages kommt kein Fehler. Erst wenn ich die neue Komponente auf dem Formular plaziere und was an den Properties einstellen will.

Weiß jemand wo man bei sowas am Besten anfängt zu suchen?

Danke

Josef

himitsu 31. Okt 2012 11:53

AW: Grafikformat prüfen
 
Ähhh, wieso nicht einfach so?
Delphi-Quellcode:
Canvas.StretchDraw(ClientRect, Image1.Picture.Graphic);



Aber warum willst du das Bild von einem TImage manuell auf die Form malen und läßt es nicht das Image machen?
(Align und Stretch)

Wird das TImage nur als "interner" Bild-Container genutzt?
Wenn ja, wieso?
Dafür ist TPicture da.
TImage ist für die Darstellung eines TPicture, was als "billiger" Container etwas übertrieben ist.
(Ich kann natürlich meinen Einkauf mit einem Tieflader heimbringen, selbst wenn ein Fiat Panda reichen würde)



Zitat:

Es kommt immer noch "Abstrakter Fehler".
Und wo? (schön das wird einen Debugger haben .. nur nutzen muß man den mal)

Sagt dir dein Compiler eigentlich nicht irgendwas vonwegen "Variable ico ist nicht initialisiert" ?
Du erstellst TIcon nicht immer, versuchst es aber immer freizugeben. Das ist grundsätzlich erstmal nicht schlimm, aber wenn man dann nichtmal diese Variavle initialisiert hat (z.B. nil), dann muß das Freigeben zwangsläufig knallen.

Bummi 31. Okt 2012 12:37

AW: Grafikformat prüfen
 
Klingt als ob eine als abstrakt deklarierte Methode der Basisklasse Deiner Klasse nicht in Deiner Klasse implementiert wäre.

josefkoller 31. Okt 2012 14:34

AW: Grafikformat prüfen
 
Hallo,

Zitat:

Zitat von himitsu (Beitrag 1189220)
Ähhh, wieso nicht einfach so?
Delphi-Quellcode:
Canvas.StretchDraw(ClientRect, Image1.Picture.Graphic);



Aber warum willst du das Bild von einem TImage manuell auf die Form malen und läßt es nicht das Image machen?
(Align und Stretch)

Wird das TImage nur als "interner" Bild-Container genutzt?
Wenn ja, wieso?
Dafür ist TPicture da.
TImage ist für die Darstellung eines TPicture, was als "billiger" Container etwas übertrieben ist.
(Ich kann natürlich meinen Einkauf mit einem Tieflader heimbringen, selbst wenn ein Fiat Panda reichen würde)



Zitat:

Es kommt immer noch "Abstrakter Fehler".
Und wo? (schön das wird einen Debugger haben .. nur nutzen muß man den mal)

Sagt dir dein Compiler eigentlich nicht irgendwas vonwegen "Variable ico ist nicht initialisiert" ?
Du erstellst TIcon nicht immer, versuchst es aber immer freizugeben. Das ist grundsätzlich erstmal nicht schlimm, aber wenn man dann nichtmal diese Variavle initialisiert hat (z.B. nil), dann muß das Freigeben zwangsläufig knallen.

Wie ich schrieb, ich hab das nur mal eben schnell mit onpaint und Image1 probiert, weil ich zuerst dachte, der Fehler käme von der Malerei in meiner Komponente.

In der Komponente selber wird alles was erzeugt wird auch wieder freigegeben.

Danke auch für Deinen "hämisch" gemeinten Hinweis auf einen Debugger.

Du kannst den Debugger im Komponentencode setzen, wo Du willst, so findest Du in meinem Fall den Fehler nicht.

Danke trotzdem.

Josef

josefkoller 31. Okt 2012 14:45

AW: Grafikformat prüfen
 
Hallo,

Zitat:

Zitat von Bummi (Beitrag 1189227)
Klingt als ob eine als abstrakt deklarierte Methode der Basisklasse Deiner Klasse nicht in Deiner Klasse implementiert wäre.

//*****************************

type
TSysBtnClick = procedure (Sender: TObject; AName:string) of Object;

TGradientOrientation = (gsVertical, gsHorizontal,gsHorizontalNeon, gsVerticalNeon);
TCaptionAlignment = (caLeft, caCenter, caRight); //footerCaption
TPixelRec = packed record
case Boolean of
true: (Color: TColor);
false: (r, g, b, Reserved: Byte);
end;

TKFPanel = class;

TFormOptions = class(TPersistent)
private
FPanel:TKFPanel;

//***********************

Ich hab z.B. eine eigene Prozedur in meiner Komponente.

TSysBtnClick = procedure (Sender: TObject; AName:string) of Object;

.....

TKFPanel = class(TPanel)
private
{ Private declarations }
FonSysBtnClick : TSysBtnClick;
...
published
property onSysBtnClick:TSysBtnClick read FonSysBtnClick write FonSysBtnClick;
...
und die Zuweisung dann so:
....
if Assigned(FonSysBtnClick) then FonSysBtnClick(Self, 'SysBtnLeft');
....

Müßte doch auch stimmen. Ich hab aber auch diese Sachen rausgenommen. Immer das Gleiche. Das Package läßt sich kompilieren.

Nach dem Plazieren der Komponente auf einer Form und einem Klick auf den PorpertyEditor kommt wieder mein "Abstrakter Fehler".

Am Besten ich mach das Ding nochmal neu. Interessieren würde mich aber schon, was diesen Fehler auslöst.

Danke für die Hinweise.

Josef

Bummi 31. Okt 2012 15:59

AW: Grafikformat prüfen
 
Zitat:

Am Besten ich mach das Ding nochmal neu
Warum gleich aufgeben?
Hast Du die Komponente mal zur Laufzeit erzeugt, dann könntest Du einfach den Debugger nehmen ...
Ansonsten in Deinen Vorfahren schauen was rein als abstract deklariert ist und bei Dir kein passendes Override findet.

josefkoller 31. Okt 2012 16:55

AW: Grafikformat prüfen
 
Hallo,

ich trau es mir ja fast nicht zu sagen, aber der Fehler lag am Grafikformat.

Ich hab den "grafischen Eigenschaften" meiner Komponente verschiedene Formate zum Testen zugeordnet, weil ich eben auf der Suche nach einer Möglichkeit war, um verschiedene Formate auf dem Canvas darstellen zu können.

Alle hatten TPicture. Beim Rumprobieren hab ich dann bei einem Property TGraphic zugewiesen und vergessen, nach erfolglosem Test, es wieder auf TPicture zu stellen.

Dieses

fBackground:TGraphic war der Auslöser. Jetzt steht es wieder auf fBackground:TPicture.

Der "abstrakte Fehler" ist damit weg.

Danke für eure Geduld.

Josef

Sir Rufo 31. Okt 2012 17:02

AW: Grafikformat prüfen
 
@josefkoller Wenn du deine Quelltexte in
Code:
[DELPHI]
procedure foo;
begin
  DoSomething;
end;
[/DELPHI]
einschließen würdest, dann bekämen wir nicht alle so einen Augenkrebs beim Anschauen.
Delphi-Quellcode:
procedure foo;
begin
  DoSomething;
end;
EDIT: Und bis zu 24h kannst du alle deine Beiträge noch bearbeiten ... um z.B. die fehlenden Tags zu ergänzen

Popov 31. Okt 2012 17:05

AW: Grafikformat prüfen
 
Schön, dass es jetzt klappt, nur ein Tipp für die Zukunft. Deine Quelltexte, es wäre schön wenn du sie in die richtigen Tags paceken könntest. Das wären
Code:
[DELPHI][/DELPHI]
von Hand eingegeben oder den Code markieren und auf den Helm mit dem Irokesenschnitt klicken. Das nur mal so am Rande.

josefkoller 31. Okt 2012 19:24

AW: Grafikformat prüfen
 
Hallo,

Danke für die Hinweise.

Ich frag nicht oft, weil man die meisten Probleme mit Googeln lösen kann.

Wenn ich wieder Fragen hab, werd ich richtig zitieren. hab den "Helm gefunden.

Ciao

Josef

Popov 31. Okt 2012 19:59

AW: Grafikformat prüfen
 
Mit der Google-Erfahrung kennst du dann ja die Foren und hast dich wahrscheinlich ganz doll gewundert wieso bei den anderen Leuten der Code so schön formatiert ist und deiner nicht. Siehst du, man erfährt nicht alles über Google :wink:


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