Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bildbearbeitung mit Delphi (https://www.delphipraxis.net/160873-bildbearbeitung-mit-delphi.html)

Muellermilchtrinker 5. Jun 2011 20:09

Bildbearbeitung mit Delphi
 
Hallo DP,

da ich noch nie Bilder mit Delphi bearbeitet habe, frage ich einfach hier. Also ich habe ein Bild in einem TImage. Nun möchte ich von diesem die Größe ändern (angabe der neuen Größe in Pixel) und dann in ein neues TImage laden. Danach möchte ich schrittweise die Pixel in andere Farben konvertieren. Ich dachte daran, die Farbe des aktuellen Pixels auslesen und dann vergleichen, an welcher neuen Farbe er am nächsten dran ist und dann die Farbe ersetzen. Das neue Bild soll wieder in einem neuen TImage angezeigt werden. Die neuen Farben kann ich gerade nicht sagen, da der Beitrag mit dem Handy erstanden ist und das ungefähr 12 stk. sind.

scrat1979 5. Jun 2011 21:08

AW: Bildbearbeitung mit Delphi
 
Vielleicht helfen Dir die ImageEn-Komponenten (jetzt kostenlos) weiter...

Satty67 5. Jun 2011 21:35

AW: Bildbearbeitung mit Delphi
 
Auch nicht schlecht ist gdiplus von http://www.progdigy.com (sind auch massig Demos dabei)

Wenn es bei Delphi-VCL bleiben soll... meines Wissens:

Für fast alle Arbeiten muss als Zwischenschritt ein TBitmap herhalten.
Zugriff auf die Pixel am besten per Scanline.
32bit Bitmaps (RGBA) werden nicht richtig unterstützt.

Jens01 5. Jun 2011 21:58

AW: Bildbearbeitung mit Delphi
 
Ich würde den Klassiker nehmen :
http://www.graphics32.org

Neutral General 6. Jun 2011 09:04

AW: Bildbearbeitung mit Delphi
 
Wer diesen Thread hier liest, der bekommt doch mal wieder das Vorurteil ggü. Delphi-Programmierern bestätigt, dass diese alles ihre Komponenten erledigen lassen und ihre Programme zusammenklicken! :evil:

Das hier ist doch wirklich keine großartige Aufgabe. Dafür braucht niemand irgendwelche Super-Komponenten oder GDI+ oder sonstiges.

:arrow: Das Bild per MSDN-Library durchsuchenStretchBlt vom Image auf ein größeres Bitmap kopieren (auch mal hier in der DP suchen!)
:arrow: Mit ner verschachtelten Schleife + Scanline alle Pixel durchgehen und nach irgendwelchen Kriterien (die ja nur der Thread-Ersteller momentan kennt) die Pixel nach und nach durch andere ersetzen.

fertig.

Jens01 6. Jun 2011 09:55

AW: Bildbearbeitung mit Delphi
 
Zitat:

Wer diesen Thread hier liest, der bekommt doch mal wieder das Vorurteil ggü. Delphi-Programmierern bestätigt, dass diese alles ihre Komponenten erledigen lassen und ihre Programme zusammenklicken!
Ich möchte keine Diskussion anfangen, aber wo sollte soetwas ein Vorurteil oder etwas Negatives sein, wenn man gute Komponenten/ Objekte nimmt und diese arbeiten läßt. Wenn Du sowas nicht machst, würdest Du kein größeres Programm hinbekommen. Du programmierst Dir das OS (Windows/Linux usw) ja auch nicht jedes mal neu.

Neutral General 6. Jun 2011 09:58

AW: Bildbearbeitung mit Delphi
 
@Jens01: Nö, aber man muss sich nicht für jeden Mist direkt ne Komponente installieren, wenn mans auch grad selbst machen kann. Ich finde Programmierer sollten nämlich zumindest noch ein bisschen programmieren können... :roll:

Jens01 6. Jun 2011 10:10

AW: Bildbearbeitung mit Delphi
 
Okay, ich selbst bin zumindest kein Informatiker...8-)

Progman 6. Jun 2011 10:16

AW: Bildbearbeitung mit Delphi
 
Zitat:

Zitat von Neutral General (Beitrag 1104780)
@Jens01: Nö, aber man muss sich nicht für jeden Mist direkt ne Komponente installieren, wenn mans auch grad selbst machen kann. Ich finde Programmierer sollten nämlich zumindest noch ein bisschen programmieren können... :roll:

Das möcht ich zu 100% unterschreiben! :)

Muellermilchtrinker 6. Jun 2011 18:54

AW: Bildbearbeitung mit Delphi
 
Zitat:

Zitat von Progman (Beitrag 1104783)
Zitat:

Zitat von Neutral General (Beitrag 1104780)
@Jens01: Nö, aber man muss sich nicht für jeden Mist direkt ne Komponente installieren, wenn mans auch grad selbst machen kann. Ich finde Programmierer sollten nämlich zumindest noch ein bisschen programmieren können... :roll:

Das möcht ich zu 100% unterschreiben! :)

Und genau das werde ich versuchen. Das ganze mit der mitgelieferten TImage Komponente zu tun. Bei kurzem schauen mit Bildbearbeitung in Delphi (DT) hab ich gesehen, dass man Pixel einzeln ansprechen kann. Mein Problem ist nur, dass Bild zu verkleinern und nachher ein neues Bild zu erstellen, anhand der neuen Pixelfarbe. Aber ich werde mich mal schlau machen.

zeras 6. Jun 2011 19:11

AW: Bildbearbeitung mit Delphi
 
Zitat:

Zitat von Muellermilchtrinker (Beitrag 1104890)
Mein Problem ist nur, dass Bild zu verkleinern und nachher ein neues Bild zu erstellen, anhand der neuen Pixelfarbe.

Mach doch erst Stretchbit, wie oben beschrieben. Dann hast du die Größe und kannst mit den Farben machen was du willst.

Muellermilchtrinker 9. Jun 2011 18:10

AW: Bildbearbeitung mit Delphi
 
Also ich häng nun doch beim verkleinern.
Ich nutze folgenden Code:
Delphi-Quellcode:
  Image2.Canvas.StretchDraw(Rect(0,
                               0,
                               30,
                               30),
                               image1.Picture.bitmap);
Doch nun gibt es ein paar Dinge: 1. Damit funktionieren nur Bitmaps und 2. Wird das Bild oben klein angezeigt und darum ein weißen Hintergrund. Ich möchte, dass das Bild nun groß angezeigt wird, dass man die einzelnen Pixelgrenzen sieht. Vielleicht kann mir jmd. helfen

Jens01 9. Jun 2011 18:34

AW: Bildbearbeitung mit Delphi
 
Ganz habe ich nicht verstanden, wo genau Dein Problem liegt, aber es gibt eigentlich verschiedene Verfahren, wie gestretcht wird...

Also eigentlich solltest Du Dir das mal so ganz schnell selber schreiben können, so wie ich das hier verstanden habe.
Hier mal eine Unit, wie man das mit Graphics32 machen kann :
Delphi-Quellcode:
procedure GR32Stretch(Src: TBitmap32; Dst: TBitmap; proportional: Boolean = True; Quality: Integer = 3);
var
  Dst2: TBitmap32;
begin
  Dst2 := TBitmap32.Create;
  Dst2.Assign(Dst);

  GR32Stretch(Src, Dst2, proportional, Quality);

  Dst.Assign(Dst2);
  Dst2.Free;
end;

procedure SetProportional(dstBMP: TBitmap32; scrRECT: TRect);
begin
  if RectHeight(scrRECT) > RectWidth(scrRECT) then
    dstBMP.Width := Round(RectWidth(scrRECT) * dstBMP.Height / RectHeight(scrRECT))
  else
    dstBMP.Height := Round(RectHeight(scrRECT) * dstBMP.Width / RectWidth(scrRECT));
end;

procedure GR32Stretch(Src, Dst: TBitmap32; proportional: Boolean = True; Quality: Integer = 3);
// http://graphics32.org/wiki/FAQ/Resampling
var
  R3: TKernelResampler;
  R2: TLinearResampler;
  R1: TDraftResampler;
  R0: TNearestResampler;
begin
  if (Src.Width < 1) or (Src.Height < 1) or (Dst.Width < 1) or (Dst.Height < 1) then
    Exit;

  if proportional then
    SetProportional(Dst, Src.BoundsRect);

  case Quality of
    3:
      begin
        R3 := TKernelResampler.Create(Src);
        R3.Kernel := TLanczosKernel.Create;
      end;
    2:
      begin
        R2 := TLinearResampler.Create(Src);
      end;
    1:
      begin
        R1 := TDraftResampler.Create(Src);
      end;
    0:
      begin
        R0 := TNearestResampler.Create(Src);
      end;
  end;

  Dst.Draw(Dst.BoundsRect, Src.BoundsRect, Src);
end;

end.

freeway 9. Jun 2011 19:16

AW: Bildbearbeitung mit Delphi
 
quick & dirty
Delphi-Quellcode:
image1.Width := 30;
image1.Height := 30;
Image1.Canvas.StretchDraw(Rect(0,
                               0,
                               30,
                               30),
                               image2.Picture.bitmap);

image1.Width := 300;
image1.Height := 300;
image1.Stretch := true;

Muellermilchtrinker 9. Jun 2011 19:31

AW: Bildbearbeitung mit Delphi
 
@freeway: so einfach O.o

Also das funktioniert nun, vielleicht weiß noch jemand, wie man das auf JPEGs und PNGs erweitern kann? funktioniert gerade nur mit BMPs

freeway 9. Jun 2011 21:24

AW: Bildbearbeitung mit Delphi
 
Delphi-Quellcode:
procedure JPEGtoBMP(const FileName: TFileName);
var jpeg : TJPEGImage;
    bmp : TBitmap;
begin
  jpeg := TJPEGImage.Create;
  try
    jpeg.CompressionQuality := 100; {Default Value}
    jpeg.LoadFromFile(FileName);
    image1.Assign(jpeg);
  finally
    jpeg.Free
  end;
end;

annsonsten Dieses Forum durchsuchen png als stichwort

DeddyH 10. Jun 2011 07:21

AW: Bildbearbeitung mit Delphi
 
Wie ist es hiermit?

Muellermilchtrinker 10. Jun 2011 18:28

AW: Bildbearbeitung mit Delphi
 
@DeddyH: Bei deinem code bekomme ich in folgender Zeile
Delphi-Quellcode:
  Assert(Assigned(src) and Assigned(dest));
einen Error:
Code:
Erste Gelegenheit für Exception bei $759DB727. Exception-Klasse EAssertionFailed mit Meldung 'Assertion fehlgeschlagen ([i]pfad[/i], Zeile 41)'. Prozess Project1.exe (2320)

DeddyH 10. Jun 2011 18:41

AW: Bildbearbeitung mit Delphi
 
Hast Du denn auch eine Quell- und eine Zielgrafik übergeben (beide müssen bereits erzeugt worden sein)?

Muellermilchtrinker 10. Jun 2011 18:49

AW: Bildbearbeitung mit Delphi
 
Ich mache das so:
Delphi-Quellcode:
StretchGraphic(Image1.Picture.Graphic,Image2.Picture.Graphic,30,30,False);
Wobei Image2 leer ist

blackfin 11. Jun 2011 00:00

AW: Bildbearbeitung mit Delphi
 
Zitat:

Nö, aber man muss sich nicht für jeden Mist direkt ne Komponente installieren, wenn mans auch grad selbst machen kann. Ich finde Programmierer sollten nämlich zumindest noch ein bisschen programmieren können...
Werde ich nun verdammt, wenn ich den ersten Teil anders sehe?
Je mehr gute Komponenten es gibt, die man für standarisierte Aufgaben nehmen kann, desto mehr kann man sich auf das eigentliche Applikations-Design konzentrieren.
Deswegen muss die Verwendung von Komponenten nicht zwangsläufig heissen, dass man selbst nicht programmieren kann.
Mich für meinen Teil nervt es nämlich, jeden kleinen Sch**** selbst von Anbeginn programmieren zu müssen, was mehr Zeit kosten kann als das wirklich wichtige Zeug, bei dem man sich dann Ausleben kann.
Klar, das kommt immer darauf an, um was es sich handelt. Bei vielen Dingen ist der Umgang mit der "Grundlagenforschung" eine willkommene Bereicherung des eigenen Wissen, jedoch gibt es Dinge, die im Alltag vorkommen und für die man nicht unendlich Zeit aufbringen will, da es zu einem "Standard" gehört und sich nicht einmal eine Befriedigung einstellen würde, wenn man es selbst löst.

Deswegen löse ich mich mal aus der Masse und sage: "Ich mag Komponenten für jede Standard-Aufgabe haben, damit ich selbst andere Dinge entwickeln kann, die ich dann vielleicht wiederum anderen zur Verfügung stellen kann".
Diejenigen, die sich in die Tiefe bei Standard-Aufgaben frickeln wollen, sollen dies tun. Vor diesen ziehe ich meinen Hut. Jedoch ich bin Applikations-Designer, kein Pionier, der ich nicht sein will.

Meiner Meinung folgt eine gute Programmier-Umgebung auch etwas der .NET-Philosophie: Du hast Bibliotheken für alles, mach was draus! Und halte dich nicht mit dem Mist auf, den schon 1000 andere gemacht haben und der zum Alltag gehört.

Die gesamte IT-Branche setzt darauf, dass bestehendes weiterentwickelt wird bzw. neue Entwicklungen auf bestehenden basieren.
Oder macht ihr einen Prozessor-Designer auch dumm von der Seite an, der die Dokumente zur Harvard-Architektur verwendet, anstatt sie neu zu erfinden?

Natürlich gebe ich euch auch etwas recht. Komponenten für 10-Zeiler braucht kein Mensch. Jedoch ist eine ausgefeilte Grafik-Bibliothek alles andere als das *lächelt*
Einen guter (Delphi-) Programmierer macht meiner Meinung nach nicht aus, dass er selbst alles ohne Komponenten gelöst hat, sondern dass er intelligent agiert und abschätzen kann, was er selbst macht und was nicht. Fernab von der Spekulation, dass Komponenten-User schlechte Programmierer sind :-)

Oh, und ja, zerreisst mich ruhig :-)
Ich bin kein Profi, wahrscheinlich nicht mal ein mittelmäßiger Programmierer, ich habe nur meine Meinung gepostet, die natürlich bei jedem anderen abweichen kann *s*

DeddyH 11. Jun 2011 07:38

AW: Bildbearbeitung mit Delphi
 
Zitat:

Zitat von Muellermilchtrinker (Beitrag 1105732)
Ich mache das so:
Delphi-Quellcode:
StretchGraphic(Image1.Picture.Graphic,Image2.Picture.Graphic,30,30,False);
Wobei Image2 leer ist

Leer bedeutet nil? Das ist dann falsch, ich hatte die Benutzung der Routine so vorgesehen (Beispiel aus dem Kopf, Fehler vorbehalten):
Delphi-Quellcode:
Quelle := TBitmap.Create;
try
  Ziel := TJPEGImage.Create;
  try
    Quelle.LoadFromFile(Dateiname);
    StretchGraphic(Quelle, Ziel, 200, 200);
    ImageBla.Picture.Graphic.Assign(Ziel);
  finally
    Ziel.Free;
  end;
finally
  Quelle.Free;
end;

Jens01 11. Jun 2011 13:22

AW: Bildbearbeitung mit Delphi
 
@Blachfin Gut, dass einer auf meiner Seite ist.
Zu sehen ist, dass hier auch gerade mit Komponenten gearbeitet wird. Es ist ja nicht so, dass die Verzerrung hier selbst programmiert wird.
Warte bis Milchtrinker an der STelle ist, wo er die Farben vergleichen will...

Muellermilchtrinker 12. Jun 2011 17:35

AW: Bildbearbeitung mit Delphi
 
Also der Code von DeddyH funktioniert. Hab davor einfach das Ausgangsimage einfach mal weiß gezeichnet. :stupid:

Nun bin ich an der Stelle, die Farben zu vergleichen. Ich möchte 2 Farben vergleichen ein Ergebnis von 0 (nicht ähnlich) bis 100 (gleich) zurückzugeben. Dafür such ich nun ein paar Ideen. Ich denke ich muss die Farben in die RGB Werte umzurechnen und dann die Differenz berechnen und dann den Durchschnitt berechnen. Macht das Sinn? Hat jemand bessere Ideen? Wäre dankbar.

mkinzler 12. Jun 2011 17:39

AW: Bildbearbeitung mit Delphi
 
Per .Pixels[] kanst du direkt auf die Pixel zugreifen

Muellermilchtrinker 12. Jun 2011 17:43

AW: Bildbearbeitung mit Delphi
 
Zitat:

Zitat von mkinzler (Beitrag 1105973)
Per .Pixels[] kanst du direkt auf die Pixel zugreifen

Das weiß ich. Es geht nur darum, wie ich wirklich die Farben vergleichen soll und ob meine Überlegungen in Ordnung sind?

freeway 12. Jun 2011 20:22

AW: Bildbearbeitung mit Delphi
 
gehen tut das allerdings ist das nicht unbedingt die schnellste methode
scanline ist eine andere möglichkeit

http://www.delphipraxis.net/136434-f...tml#post928603

BUG 12. Jun 2011 20:37

AW: Bildbearbeitung mit Delphi
 
Zitat:

Zitat von Muellermilchtrinker (Beitrag 1105974)
Das weiß ich. Es geht nur darum, wie ich wirklich die Farben vergleichen soll und ob meine Überlegungen in Ordnung sind?

Jetzt suchst du also eine Distanzfunktion.

Deine vorgeschlagene Funktion könnte funktionieren, je nachdem was du was du für ein Ergebnis haben möchtest.
Allerdings könntest du überlegen, ob du deine Distanz vielleicht mit einem anderen Farbmodell berechnen willst.

Muellermilchtrinker 13. Jun 2011 20:46

AW: Bildbearbeitung mit Delphi
 
Hat keiner eine Idee, wie man Farben vergleichen kann? Ein Ansatz würde mir helfen.

Jens01 13. Jun 2011 21:36

AW: Bildbearbeitung mit Delphi
 
Bin mir nicht ganz sicher, aber hier könnte ein Lösungsansatz drin sein.
http://www.efg2.com/Lab/Graphics/Colors/HSV.htm
Ich glaube, das verfolgt den Ansatz von BUG.
Dieser Hue-Wert/Winkel ist Dein Vergleichswert.

freeway 13. Jun 2011 21:43

AW: Bildbearbeitung mit Delphi
 
du kannst die per pixels ermittelten farben direkt miteinander vergleichen

if pic1.canvas.pixels 1 = pic2.canvas.pixels then ...

BUG 13. Jun 2011 22:11

AW: Bildbearbeitung mit Delphi
 
Zitat:

Zitat von freeway (Beitrag 1106214)
du kannst die per pixels ermittelten farben direkt miteinander vergleichen

Das ist für sein Vorhaben allerdings nicht so nützlich ;)
Zitat:

Ich dachte daran, die Farbe des aktuellen Pixels auslesen und dann vergleichen, an welcher neuen Farbe er am nächsten dran ist und dann die Farbe ersetzen.


Mal ein einfacher Vorschlag für eine Distanzfunktion:
Code:
d(c1, c2) = sqrt(sqr(c1.r - c2.r) + sqr(c1.g - c2.g) + sqr(c1.b - c2.b))
Je größer d(c1, c2) ist, desto größer ist die "Entfernung" der beiden Farben.

Muellermilchtrinker 14. Jun 2011 16:38

AW: Bildbearbeitung mit Delphi
 
Zitat:

Zitat von BUG (Beitrag 1106217)
Mal ein einfacher Vorschlag für eine Distanzfunktion:
Code:
d(c1, c2) = sqrt(sqr(c1.r - c2.r) + sqr(c1.g - c2.g) + sqr(c1.b - c2.b))
Je größer d(c1, c2) ist, desto größer ist die "Entfernung" der beiden Farben.

Hab das gerade mal in Excel getestet. Da fehlen natürlich Betragsstriche, sonst gibts ein Error mit 'ner negativen Wurzel. Macht soweit Sinn. Werde das mal in Delphi einbauen und dann nochmal Bescheid geben.

BUG 14. Jun 2011 17:01

AW: Bildbearbeitung mit Delphi
 
Zitat:

Zitat von Muellermilchtrinker (Beitrag 1106348)
Da fehlen natürlich Betragsstriche, sonst gibts ein Error mit 'ner negativen Wurzel.

Delphi-Referenz durchsuchensqr. Das Quadrat einer (reellen) Zahl ist immer positiv.


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