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. |
AW: Bildbearbeitung mit Delphi
Vielleicht helfen Dir die ImageEn-Komponenten (jetzt kostenlos) weiter...
|
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. |
AW: Bildbearbeitung mit Delphi
Ich würde den Klassiker nehmen :
http://www.graphics32.org |
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 StretchBlt 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. |
AW: Bildbearbeitung mit Delphi
Zitat:
|
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:
|
AW: Bildbearbeitung mit Delphi
Okay, ich selbst bin zumindest kein Informatiker...8-)
|
AW: Bildbearbeitung mit Delphi
Zitat:
|
AW: Bildbearbeitung mit Delphi
Zitat:
|
AW: Bildbearbeitung mit Delphi
Zitat:
|
AW: Bildbearbeitung mit Delphi
Also ich häng nun doch beim verkleinern.
Ich nutze folgenden Code:
Delphi-Quellcode:
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
Image2.Canvas.StretchDraw(Rect(0,
0, 30, 30), image1.Picture.bitmap); |
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. |
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; |
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 |
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 |
AW: Bildbearbeitung mit Delphi
Wie ist es hiermit?
|
AW: Bildbearbeitung mit Delphi
@DeddyH: Bei deinem code bekomme ich in folgender Zeile
Delphi-Quellcode:
einen Error:
Assert(Assigned(src) and Assigned(dest));
Code:
Erste Gelegenheit für Exception bei $759DB727. Exception-Klasse EAssertionFailed mit Meldung 'Assertion fehlgeschlagen ([i]pfad[/i], Zeile 41)'. Prozess Project1.exe (2320)
|
AW: Bildbearbeitung mit Delphi
Hast Du denn auch eine Quell- und eine Zielgrafik übergeben (beide müssen bereits erzeugt worden sein)?
|
AW: Bildbearbeitung mit Delphi
Ich mache das so:
Delphi-Quellcode:
Wobei Image2 leer ist
StretchGraphic(Image1.Picture.Graphic,Image2.Picture.Graphic,30,30,False);
|
AW: Bildbearbeitung mit Delphi
Zitat:
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* |
AW: Bildbearbeitung mit Delphi
Zitat:
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; |
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... |
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. |
AW: Bildbearbeitung mit Delphi
Per .Pixels[] kanst du direkt auf die Pixel zugreifen
|
AW: Bildbearbeitung mit Delphi
Zitat:
|
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 |
AW: Bildbearbeitung mit Delphi
Zitat:
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. |
AW: Bildbearbeitung mit Delphi
Hat keiner eine Idee, wie man Farben vergleichen kann? Ein Ansatz würde mir helfen.
|
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. |
AW: Bildbearbeitung mit Delphi
du kannst die per pixels ermittelten farben direkt miteinander vergleichen
if pic1.canvas.pixels 1 = pic2.canvas.pixels then ... |
AW: Bildbearbeitung mit Delphi
Zitat:
Zitat:
Mal ein einfacher Vorschlag für eine Distanzfunktion:
Code:
Je größer d(c1, c2) ist, desto größer ist die "Entfernung" der beiden Farben.
d(c1, c2) = sqrt(sqr(c1.r - c2.r) + sqr(c1.g - c2.g) + sqr(c1.b - c2.b))
|
AW: Bildbearbeitung mit Delphi
Zitat:
|
AW: Bildbearbeitung mit Delphi
Zitat:
|
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