AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Ein Bild mit einer Farbe multiplizieren?
Thema durchsuchen
Ansicht
Themen-Optionen

Ein Bild mit einer Farbe multiplizieren?

Ein Thema von Cyberstorm · begonnen am 23. Jan 2008 · letzter Beitrag vom 28. Jan 2008
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#11

Re: Ein Bild mit einer Farbe multiplizieren?

  Alt 23. Jan 2008, 22:05
Hossa Cyberstorm,

Ich Studiere Informatik, im 7. Semester mit Vetierfung VIS, und da schreibt jeder mal nen Raytracer

Im 1. Fall kommen Immer werte zwischen 0..1 raus
Du liest die RGB werte aus, dann Skalleirst du sie auf 0..1 ( Also durch 255 Teilen ) dann die Berechnung und danach wieder HochsKalieren => ex kommt wieder ein Wert zwischen 0..1 das ist mit ein rund warum OgenGL alles auf 0..1 abbilden kann.

Bei Meinem Raytracer genau wie bei anderen Kann man ,wenn dann doch Größere Werte Auftreten die Mittels Scaling oder clamping weiterverarbeiten.

Dein Faktor ist auch ganz einfach.

Stell dir For du willst dein Bild Grün Färben ( Grün = (0,255,0) )
dann willst du 50% Grün haben das ergibt dann (Farbe alt = ( x,y,z))

Delphi-Quellcode:
Prozent := 50 / 100;
Farbe_neu :=( max(0,min(255,round(0*Prozent +x))),max(0,min(255,round(255*Prozent +y))),max(0,min(255,round(0*Prozent +z))));
Wenns noch genauer sein mus , must bis zum We warten, habe einen Hauptseminarvortrag der mich aufhält.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Ein Bild mit einer Farbe multiplizieren?

  Alt 23. Jan 2008, 23:10
Hallo Cyberstorm,

da ich mich gerade mit einer 3D-Lasertriangulation beschäftigt habe und dort Bildverarbeitung eine entscheidene Rolle spielt,
habe ich meinen Verarbeitungsquellcode mal an dein Problem angespasst.

Vielleicht hilft dir das ja weiter.

Gruss
Thorsten
Angehängte Dateien
Dateityp: zip farbe_multiplizieren_190.zip (225,5 KB, 21x aufgerufen)
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#13

Re: Ein Bild mit einer Farbe multiplizieren?

  Alt 24. Jan 2008, 09:28
danke euch beiden!

werde ich gleich mal ausprobieren...
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#14

Re: Ein Bild mit einer Farbe multiplizieren?

  Alt 24. Jan 2008, 11:04
hmm also ersteinmal machen beide funktionen von euch (omata & corpsman) das selbe aber noch nicht ganz, was ich will .
zumindest wird bei 100% nicht komplett überblendet aber das ergebnis ist nicht wie ich will (siehe bilder).

habe dein programm mal gekürzt und das einlesen der komponente überlassen:
die scroll boxen haben als onchange ereignis FormCreate...

Delphi-Quellcode:
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Self.DoubleBuffered:=true;
  Shape.Brush.Color:=RGB(SbRot.Position, SbGruen.Position, SbBlau.Position);
  Image.Picture.LoadFromFile('ori.bmp');
  Calculate;;
end;

procedure TfrmMain.Calculate;
var
  Prozent: Real;
  x, y: Integer;
  P: PRGB;
begin
  Prozent:=SbProzent.Position / 100;
   for y:=0 to Image.Picture.Height-1 do
    begin
      P:=Image.Picture.Bitmap.ScanLine[y];
       for x:=0 to Image.Picture.Width-1 do
        begin
          p.Blue:=min(255, round(((p.Blue / 255) + ((SbBlau.Position / 255) * Prozent)) * 255));
          p.Green:=min(255, round(((p.Green / 255) + ((SbGruen.Position / 255) * Prozent)) * 255));
          p.Red:=min(255, round(((p.Red / 255) + ((SbRot.Position / 255) * Prozent)) * 255));
          Inc(p);
        end;
    end;
end;
damit kommen nun folgende ergebnisse bei 100% grün (0% rot und blau) und 50%, danach 100% faktor:

programm grün:255 prozent: 50%
http://cyberstorm.hopto.org/prog_half.jpg

programm grün:255 prozent: 100%
http://cyberstorm.hopto.org/prog_full.jpg

photoshop grün:255 prozent: 50%
http://cyberstorm.hopto.org/half.jpg

photoshop grün:255 prozent: 100%
http://cyberstorm.hopto.org/full.jpg
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#15

Re: Ein Bild mit einer Farbe multiplizieren?

  Alt 24. Jan 2008, 11:12
Ja was du nu gemacht hast is t das Clamping

Probier doch einfach mal das Scaling aus.

Als du Addierst die Farbanteile wie bisher

(r,g,b)
machst dann t := max(r,max(g,b));

und bei t > 255

(r/t*255,g/t*255,b/t*255)

Diese variante Behält den Farbwert, evtl ist das besser.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#16

Re: Ein Bild mit einer Farbe multiplizieren?

  Alt 24. Jan 2008, 11:17
also ich habe gerade mal in der berechnung das "+" durch "*" ersetzt:

vorher:
(p.Blue / 255) + ((SbBlau.Position / 255) nachher:
(p.Blue / 255) * ((SbBlau.Position / 255) für Rot und Grün natürlich ebenso.

nun kommt bei grün:255 und 100% faktor das selbe ergebnis wie bei photoshop heraus (siehe letzer post).

ABER bei 50% kommt leider das bei raus :-/:

http://cyberstorm.hopto.org/dark_prog.jpg


ich guck mir ersteinmal den letzen post an und probiere das ausund melde mich dann nochmal.
  Mit Zitat antworten Zitat
Benutzerbild von Lun
Lun

Registriert seit: 4. Feb 2006
122 Beiträge
 
Delphi 2005 Professional
 
#17

Re: Ein Bild mit einer Farbe multiplizieren?

  Alt 24. Jan 2008, 11:47
Hi,

ich weiß ja nicht ob es hilft aber hier hast du eine Routine die ein Bitmap einfärbt den Raster kannste ja weglassen.
Weiß jetzt nicht ob es das ist was du suchst.

Unter Grafik / Icons / Farben / Cursor auf der Seite findest du
noch mehr Funktionen zum bearbeiten von Bildern.


greetz Lun

P.S: Wenn du das auf den Beispiel Foto bist, ich find Du kannst jede Farbe tragen, aber das Original gefällt mir am besten
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#18

Re: Ein Bild mit einer Farbe multiplizieren?

  Alt 24. Jan 2008, 11:57
ich verzweifle langsam :-/.

also habe das jetzt folgendermaßen abgeändert:

Delphi-Quellcode:
procedure TfrmMain.Calculate;
var
  Prozent: Real;
  x, y, r, g, b, t: Integer;
  P: PRGB;
begin
  Prozent:=SbProzent.Position / 100;
   for y:=0 to Image.Picture.Height-1 do
    begin
      P:=Image.Picture.Bitmap.ScanLine[y];
       for x:=0 to Image.Picture.Width-1 do
        begin
          r:=round(((p.Blue / 255) + ((SbBlau.Position / 255) * Prozent)) * 255);
          g:=round(((p.Green / 255) + ((SbGruen.Position / 255) * Prozent)) * 255);
          b:=round(((p.Red / 255) + ((SbRot.Position / 255) * Prozent)) * 255);
          t:=max(r,max(g,b));
          if t>255 then
            begin
              r:=Round(r/t*255);
              g:=Round(g/t*255);
              b:=Round(b/t*255);
            end;
          p.Blue:=b;
          p.Green:=g;
          p.Red:=r;
          Inc(p);
        end;
    end;
end;
da kommt aber quatsch bei raus. wird dann blau wenn ich grün anmache und so sachen...

die sachen von der ddr ecke sind das selbe wie diealte funktion
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#19

Re: Ein Bild mit einer Farbe multiplizieren?

  Alt 24. Jan 2008, 12:06
Du bringst mich noch dazu das ich hergehe und das geschwind implementiere...

Also Vergiss unsere bisherigen Codeschnipsel mahcs nochmal neu

1. Alter Farbwert Hohlen
2. Überblendfarbe Hohlen und dann Komponentenweise * Prozent
3. Alte Farbe + Neue Farbe
4. Behandlung des Überlaufes

5.1 Clamping ( d.h. die Min(max( .. Geschichte )


ODER


5.2 Scaling D.h. du schaust ob Max(r,b,g) > 255 , wenn Ja dann Skallierst du alle 3 Farbwerte so das der Max(R,G,B) = 255 wird.

6. Speichern.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#20

Re: Ein Bild mit einer Farbe multiplizieren?

  Alt 24. Jan 2008, 12:34
Ich glaube, ihr kommt etwas vom Weg ab.
Für den gewünschten Effekt muss doch für die originale Farbe C1, die "Multiplikator-Farbe" C2 und den Mischfaktor f (alle in [0, 1]) einfach nur folgende Formel angewendet werden:
Code:
C1 * (1 - f) + C1 * C2 * f
Und dabei ist definitiv kein Clamping/Scaling/... nötig.
Hab das mal schnell in Paint.Net nachgestellt, es kommen exakt die beiden Photoshop-Bilder aus #14 heraus.
Code:
CurrentPixel = src[x,y];
byte f = PrimaryColor.A; // der Alphakanal der Primärfarbe wird als Faktor missbraucht
CurrentPixel.R = (byte)
 ((CurrentPixel.R * (255 - f) + CurrentPixel.R * PrimaryColor.R * f / 255) / 255);
CurrentPixel.G = (byte)
 ((CurrentPixel.G * (255 - f) + CurrentPixel.G * PrimaryColor.G * f / 255) / 255);
CurrentPixel.B = (byte)
 ((CurrentPixel.B * (255 - f) + CurrentPixel.B * PrimaryColor.B * f / 255) / 255);
dst[x,y] = CurrentPixel;
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 05:59 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