Autor Beitrag
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Do 17.01.08 01:15 
Ich versuche ein bitmap in ein Timage zu laden und dann von diesem Bitmap die Durchschnittsfarbe zu berechnen. Mein Timage hat die Außmaße 20 x 20 Pixel und stretch = true. Mein Problem ist Folgendes, wenn ich die markierte Zeile nicht auskommentiere, wird mir mein Timage nicht angezeigt (visible ist immer auf true) und die function durchschnitt liefert mir (egal bei welchem bild) den selben wert : 1911716 (in RGB 164,43,29).

Mein Quelltext sieht wie folgt aus:

Die Durchschnittsfarbfunction:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
function tmain.durchschnitt:integer;
 var r,g,b:int64;
     I,J,d:integer;
     c:tcolor;
begin
 r:=0;
 g:=0;
 b:=0;

 //rgb werte addieren
 for I:=0 to imeinlesen.width-1 do
  for j:=0 to imeinlesen.height-1 do
  begin
     c:=imeinlesen.picture.Bitmap.canvas.Pixels[I,J];
     r:=r+GetRValue(d);
     g:=g+GetGValue(d);
     b:=b+GetBValue(d);
  end;

  //teilen durch pixelanzahl
  D:=imeinlesen.width *imeinlesen.Height;
  r:=round(r/d);
  g:=round(g/d);
  b:=round(b/d);


  //farbausgabe
  c:=rgb2tcolor(r,g,b);
  result:=c;

end;



Die function rgb2tcolor hab ich aus diesem thread

www.delphi-forum.de/...highlight=rgb2tcolor

ausblenden Delphi-Quelltext
1:
2:
3:
4:
function tmain.RGB2TColor(r,g,b : byte):TColor;
begin
  result := r + (g shl 8) + (b shl 16);
end;



Und der eigentliche Aufruf davon findet in einem Button statt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure Tmain.Button1Click(Sender: TObject);
begin
  if openpicturedialog.execute then
  begin
   imeinlesen.Picture.LoadFromFile(openpicturedialog.filename);
   showmessage(inttostr(durchschnitt));  //<---markierte Zeile
  end;
end;



Ich weiß echt nicht woran das liegt, die functionen scheinen zu stimmen, wenn ich durchschnitt mit TImages aufrufe, in denen zur Programmierzeit Bilder geladen werden, scheint das wunderbar zu klappen. Setz ich vor die markeirte Zeile ein application.processmessages oder ein imeinlesen.repaint dann seh ich zwar das Timage, aber die Werte von Durchschnitt bleiben falsch.
uko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Do 17.01.08 07:05 
Hallo,

mir ist aufgefallen, daß deine Durchschnittsberechnung eigentlich nie was sinnvolles liefern dürfte:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
 //rgb werte addieren
 for I:=0 to imeinlesen.width-1 do
  for j:=0 to imeinlesen.height-1 do
  begin
     // hier liest Du den Farbwert in eine Variable c ein 
     c:=imeinlesen.picture.Bitmap.canvas.Pixels[I,J];

     // die nun komplett ignoriert wird: sollte das 'd' hier nicht 'c' sein?
     r:=r+GetRValue(d);
     g:=g+GetGValue(d);
     b:=b+GetBValue(d);
  end;


Grüße,
Uli
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Do 17.01.08 07:35 
Ich würde es so tun:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
function tmain.durchschnitt:integer;
 var r,g,b:int64;
     I,J,d:integer;
     c:tcolor;
begin
 r:=0;
 g:=0;
 b:=0;

 //rgb werte addieren
 for I:=0 to imeinlesen.picture.bitmap.width-1 do
  for j:=0 to imeinlesen.pciture.bitmap.height-1 do
  begin
     c:=imeinlesen.picture.Bitmap.canvas.Pixels[I,J];
     Inc(r,GetRValue(c)); // c verwenden
     Inc(g,GetGValue(c));
     Inc(b,GetBValue(c));
  end;

  //teilen durch pixelanzahl
  D:=imeinlesen.picture.Bitmap.width *imeinlesen.picture.bitmap.Height;
  r:=round(r/d); //ev. reicht div : R := R div D;
  g:=round(g/d);
  b:=round(b/d);

  //farbausgabe
  result:=(b shl 16or (g shl 8or r;
end;

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Jann1k Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Do 17.01.08 16:36 
Danke schon mal für die Antworten, ihr habt vollkommen recht, da muss wirklich c anstatt d hin, aber das Grundproblem bleibt. Irgendwie erkennt er die Pixelfarbe im Bild nicht richtig, ich hab mir das mal genauer angeschaut, c ist immer gleich -1, das führt dazu das die rgb werte am ende immer 255,255,255 sind. Kennt sich irgendjemand genauer damit aus, warum er die Pixelfarbe nicht erkennen will bzw. was ich falsch mach?
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Do 17.01.08 17:14 
Was passiert eigentlich, wenn Du keinen Umweg über TImage gehst, sondern die Datei direkt per TBitmap.LoadFromFile in ein Bimap lädst?

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Jann1k Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Do 17.01.08 17:56 
Dann kommt ne Fehlermeldung mit dem Bitmap und ich weiß jetzt woran das die ganze Zeit lag. Ich lade die ganze Zeit jpegs und keine bitmaps, da kann das ganze ja auch nicht funktionieren...
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 17.01.08 18:53 
Wenn du JPEGs trotzdem benutzen willst, kannst du mit

ausblenden Delphi-Quelltext
1:
Bitmap.Assign(Jpeg);					

ein JPEG in eine Bitmap-Instanz importieren.