AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi TImage: Bild laden, Auswahlrahmen zeichnen,Farben vermischen

TImage: Bild laden, Auswahlrahmen zeichnen,Farben vermischen

Ein Thema von S - tefano · begonnen am 12. Okt 2008 · letzter Beitrag vom 13. Okt 2008
Antwort Antwort
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#1

TImage: Bild laden, Auswahlrahmen zeichnen,Farben vermischen

  Alt 12. Okt 2008, 02:07
Hallihallo,

ich hatte letztens schonmal in der gleichen Sache gepostet (VCL->Ein TImage über ein TImage32 legen... oder so), eigentlich bin ich jetzt nur insofern weiter, dass ich mehr Experimente hinter mir hab

Jedenfalls:
Ich will ein Programm schreiben, mit dem man bestimmte Ausschnitte aus Fotos kopieren kann. Das ganze natürlich mit ein paar nützlichen Hilfestellungen, sonst könnte man ja auch jedes Bildprogramm benutzen.
Man soll also ein Bild laden können, das einem dann auf der Form angezeigt wird. Es wird eine Auswahlbox über das Bild gezogen, damit man sieht was man sich jetzt genau holt. Diese Auswahlbox soll so aussehen wie der Rahmen im Windows XP-Explorer beim Auswählen von Dateien, nur in Grün
Jetzt hab ich die verschiedensten Sachen probiert: Foto in ein Image laden, Rahmen auf anderer Komponente zeichnen, die dann drübergelegt wird (bzw die ganze Zeit über dem Image liegt). Der innere Bereich des Rahmens soll ja aber halbtransparent sein. Also: Den Rahmen mit Scanline und pf32bit zeichnen und das Alpha-Byte entsprechend an den Stellen setzen, wo der Hintergrund durchschimmern soll. Problem dabei: Die komplette Box-Zeichnungs-Komponente wird weis, bis auf die Auswahlbox. Die hat ihre Farben so wie ich gerne hätte, nur dass im inneren Bereich nichts durchschimmert. Transparent=true ändert daran nichts.

Oder auch: Im Anzeige-Image nur ne Kopieinstanz des Fotos laden, und direkt im Image zeichnen (das Blending also selber rechnen). Problem: Zeichnen lässt mich das TImage wohl nur, wenn eine echte Bitmap geladen ist (der unwahrscheinliche Fall heutzutage...). Bei Jpegs (oder was auch immer) bekomme ich dann Zugriffsverletzung.

Oooooder: Wieder zwei Komponenten übereinander legen, nur ohne Alphabyte und Scanline, dafür mit Paintbox und komplett selber malen. Hier die Transparenz dann wieder selber rechnen, indem man nachguckt welchen Wert das Bild im TImage an der entsprechenden Stelle hat. (Also Paintbox auf Image, für die Pixel in der Paintbox manuell nachsehen was im Image drunter liegt und selber mischen). Problem: Auch lesen darf ich von der Image-Canvas nicht wenn keine echte Bitmap geladen ist.

What can I do? Ich würde es irgendwie gerne vermeiden wollen, je nach Dateityp ein anderes Zeichenverfahren zu nehmen :/
Das Problem ist ja eigentlich nur, dass ich das innere der Auswahlbox noch leicht gefärbt haben will. Ansonsten müsste ich ja garnicht auf das Image zugreifen. Wobei ich schon gespannt bin, wie ich aus dem Bild dann den gewünschten Bereich rauskopiere, wenn ich ja nicht lesen darf.

Gute Nacht,

Stefan
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#2

Re: TImage: Bild laden, Auswahlrahmen zeichnen,Farben vermis

  Alt 12. Okt 2008, 07:43
Hallo, ich hatte vor geraumer zeit auch mal mit Bildern zu tun.

Kann man denn nicht einfach das Bild laden ini einen stream oder so und diesen dann z.b. in eine Bmp umwandeln, mit der du dann deine sachen machen kannst, und zum schluss wieder zurück in das entsprechende Format wandeln?
Marco Tröger
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#3

Re: TImage: Bild laden, Auswahlrahmen zeichnen,Farben vermis

  Alt 12. Okt 2008, 18:53
als Grundgerüst ist vielleicht die TDrawontrol-Komponente nützlich, leider weis ich nicht, wie man so eine halb-Transparenz berechnet.

HTH Frank
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#4

Re: TImage: Bild laden, Auswahlrahmen zeichnen,Farben vermis

  Alt 13. Okt 2008, 00:12
Hi,

die Demo ist schonmal ziemlich cool, genau das will ich. Halbtransparent ist kein Problem, nur sitze ich schon wieder den ganzen Tag vor der Problematik, einfach nicht anständig zeichnen zu können.
Ich scheine wohl vor der Wahl zu stehen: Mistig zeichnen aber viele Bildformate, oder richtig gut zeichnen aber nur mit dem was TBitmap schluckt.

Mistig zeichnen: Auf TImage32 aus GR32 kann man eigentlich schonmal ganz nett rummalen. Nur handelt es sich nunmal um Fotos die ich bearbeiten will, und die sind ja meist ziemlich groß. Also lasse ich sie passend Stauchen damit man sie komplett sehen kann. Das Problem dabei ist, dass der Bereich auf dem ich die Box zeichnen will dadurch auch gestaucht wird. Wenn ich dann den Rahmen male, kommt es in den allermeisten Fällen vor, dass mindestens eine der Seiten des Rahmens auf einer X-/Y-Koordinate verläuft, die durch die Stauchung zu den Pixeln gehören, die nicht angezeigt werden. Man sieht den Rahmen also fast nie komplett.
Optimal wäre eigentlich, im Hintergrund den Bereich des Fotos zu haben, und davor irgendwas transparentes, dessen Bereich nicht gestaucht ist, worauf ich dann malen kann. Die Probleme der verschiedenen Koordinaten die dabei auftreten (ich müsste ja Auswahlboxdimensionen auf Fotopunkte umrechnen) sind gelöst. Nur: Ich kriege es einfach nicht hin, irgendwas auf dieses TImage32 zu legen, worauf ich zeichnen und gleichzeitig das Foto im Hintegrund sehen kann.
Es gibt da zwei Möglichkeiten des Fehlschlags die bisher immer eintreten: Entweder ist der Kandidat eine Komponente, die man irgendwie nicht vor ein TImage32 legen kann (das Image32 in den Hintergrund schicken hat genauso wenig Effekt (keinen) wie die andere Komponente in den Vordergrund zu holen), oder es handelt sich um eine Komponente, die zwar vor das TImage32 geht (bspw ein anderes TImage32), aber dieses dann ohne wenn und aber (und Transparenzeinstellungen und Alphawerten) komplett verdeckt.

Hm. Da fällt mir was ein. Könnte man das Image einfach schon Codeseitig stauchen? Also die Idee: Nicht das Bild original laden und dem TImage32 sagen "mach klein". Sondern das Bild laden, es selbst kleinrechnen (sodass seine dimensionen wirklich kleiner sind), dieses dann aufs Image legen und zeichnen, mit dem Vorteil dass das Image nicht mehr stauchen muss.

Ich probiers mal.. entweder jetzt oder morgen

Viele Grüße,

Stefan
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#5

Re: TImage: Bild laden, Auswahlrahmen zeichnen,Farben vermis

  Alt 13. Okt 2008, 00:24
Also zumindest funktioniert es schonmal, mittels Stretch aus JCLGraphics ein Bild aus einem TImage in ein anderes TImage zu schrumpfen, und bei einer Pixelmanipulation bei (100, 100) relativ weit mittig zu treffen, obwohl das Ursprungsbild eine viel größere Auflösung hatte.
Yay ^^
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#6

Re: TImage: Bild laden, Auswahlrahmen zeichnen,Farben vermis

  Alt 13. Okt 2008, 01:34
Just to let you know: Es funktioniert
Jetzt muss ich noch das Ganze via Maus beeinflussen können... wäre ja cool wenn das einigermaßen performant liefe. Falls mich einer nicht verstanden hat, und zum Angeben, siehe Screenshot im Anhang.
Miniaturansicht angehängter Grafiken
laeuft_624.png  
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#7

Re: TImage: Bild laden, Auswahlrahmen zeichnen,Farben vermis

  Alt 13. Okt 2008, 10:12
wie du den Rahmen mit der Maus setzt wird doch in meiner Demo gezeigt...zum stuchen gibt es StretchBlt und bitte nicht auf die Idee kommen, das ganze auf dem TImage(32) zu malen.

nur zur Vollständigkeit..wie hast du die halbtransparenz gemacht?

Gruß Frank
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#8

Re: TImage: Bild laden, Auswahlrahmen zeichnen,Farben vermis

  Alt 13. Okt 2008, 12:04
Jo, das wird da gezeigt, ich habs nur erwähnt weil ich mich noch nicht drum gekümmert hab. StretchBlt, joah, in meinem Fall eignet sich die Jcl-Version glaub ich besser.
Die hat halt den Vorteil dass man ihr ein TGraphic gibt, und die Ausgabe aber auf einem TBitmap stattfindet. Ich hatte ja das Problem, dass ich bei nicht-Bitmaps die ich lade, keinen vernünftigen Zugriff auf das TImage habe. Auf diese Weise kann ich das Graphic des Images auslesen, egal welches Format es ist, und bekomme eine Ausgabe mit der man arbeiten kann (und ich kann mir beim Stretchen den Filter aussuchen ).
Auf dem TImage malen: Genau so hab ichs aber gemacht Ich hatte ja das Problem, dass ich nichts transparentes über das Image legen kann und/oder ich nicht aus dem Image lesen kann (was ich aber muss wenn ich auf ner überliegenden Komponente die Farben mischen will). Gut, jetzt hab ich durch das Stretch-Kopieren ja ein normales Image mit normaler Bitmap aus der ich lesen kann, theoretisch könnte ich noch ne Paintbox drüberlegen und darauf zeichnen. Darauf werd ich zurückgreifen wenn mir das Rahmenzeichnen auf dem TImage bei Mausverschiebung zu lange dauert.

Die Farben mischen ist eigentlich ganz einfach. Ich hab mir vorher in nem Grafikprogramm die Farbe ausgesucht, die im Inneren der Box sein soll. Für einen Durchschein-Effekt muss man dann die Farbe des Boxpixels mit der Farbe des an der Stelle liegenden Bildpixels verrechnen. Das geht einfach per Durchschnitt:

Delphi-Quellcode:
mline[i].B := round((mline[i].B * 1.25 + 0 * 0.75) / 2);
mline[i].G := round((mline[i].G * 1.25 + 255 * 0.75) / 2);
mline[i].R := round((mline[i].R * 1.25 + 76 * 0.75) / 2);
In diesem Ausschnitt ist der Durchschnitt dazu noch gewichtet. Also so, dass die bildeigenen Anteile noch ein bisschen stärker durchs Grün durchscheinen. Im Beispielbild war es noch ohne Faktoren, also so:

mline[i].B := round((mline[i].B + 0) / 2); //der gewünschte Grünton hat keine Rotanteile Also ganz einfach: Bildfarbe plus Boxfarbe durch zwei
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#9

Re: TImage: Bild laden, Auswahlrahmen zeichnen,Farben vermis

  Alt 13. Okt 2008, 12:23
Zitat von S - tefano:
Auf dem TImage malen: Genau so hab ichs aber gemacht Ich hatte ja das Problem, dass ich nichts transparentes über das Image legen kann und/oder ich nicht aus dem Image lesen kann (was ich aber muss wenn ich auf ner überliegenden Komponente die Farben mischen will).
dann ändere erst dieses!!
ein TImage ist nicht zum Zeichnen geeignet, du stößt früher oder später auf Probleme.eine mögliche Realisierung ist in meinem Beispielprogramm ja schon ziemlich umfangreich vorhanden.um mehere dateitypen zu unterstützen bastelst du halt eine Lade-Methode, die die datei in das TBitmap-format umwandelt (und Typ merken zum späteren Speichern).
Zitat von S - tefano:
Gut, jetzt hab ich durch das Stretch-Kopieren ja ein normales Image mit normaler Bitmap aus der ich lesen kann, theoretisch könnte ich noch ne Paintbox drüberlegen und darauf zeichnen. Darauf werd ich zurückgreifen wenn mir das Rahmenzeichnen auf dem TImage bei Mausverschiebung zu lange dauert.
2 komponenten übereinander zu legen ist genauso unsauber...shau dir doch einfach mal die Demo an, da ist doch fast alles drin...
Zitat von S - tefano:
Die Farben mischen ist eigentlich ganz einfach. Ich hab mir vorher in nem Grafikprogramm die Farbe ausgesucht, die im Inneren der Box sein soll. Für einen Durchschein-Effekt muss man dann die Farbe des Boxpixels mit der Farbe des an der Stelle liegenden Bildpixels verrechnen. Das geht einfach per Durchschnitt:

Delphi-Quellcode:
mline[i].B := round((mline[i].B * 1.25 + 0 * 0.75) / 2);
mline[i].G := round((mline[i].G * 1.25 + 255 * 0.75) / 2);
mline[i].R := round((mline[i].R * 1.25 + 76 * 0.75) / 2);
In diesem Ausschnitt ist der Durchschnitt dazu noch gewichtet. Also so, dass die bildeigenen Anteile noch ein bisschen stärker durchs Grün durchscheinen. Im Beispielbild war es noch ohne Faktoren, also so:

mline[i].B := round((mline[i].B + 0) / 2); //der gewünschte Grünton hat keine Rotanteile Also ganz einfach: Bildfarbe plus Boxfarbe durch zwei
ich geh jetzt mal davon aus, dass du das mittels scanline machst jedoch bin ich noch am rätseln, was deine Konstanten da bedeuten. Farbwert, gewichtung etc.dein Kommentar z.b. verwirrt mich gerade...dort steht was von grün und rot, verwendest da aber nur den blauwert

Gruß Frank
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#10

Re: TImage: Bild laden, Auswahlrahmen zeichnen,Farben vermis

  Alt 13. Okt 2008, 12:30
Oh, sorry. Ja, es war Blau gemeint
Die 1.25 und 0.75 sind Gewichtungsfaktoren, die anderen Konstanten sind die Farbanteile des Grüntons den ich reinmische.
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 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