AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Durchschnittsfarbe eines TBitmap via Scanline?
Thema durchsuchen
Ansicht
Themen-Optionen

Durchschnittsfarbe eines TBitmap via Scanline?

Ein Thema von Cyberstorm · begonnen am 21. Jan 2008 · letzter Beitrag vom 22. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
Cyberstorm

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

Durchschnittsfarbe eines TBitmap via Scanline?

  Alt 21. Jan 2008, 19:28
hallo.

ich bin gerade dabei eine funktion zu schreiben, die mir als rückgabewert vom typ TRGB die durchschnittsfarbe eines bestimmten bereiches eines Tbitmaps liefert.

ich habe sozusagen einen x und y startpunkt und eine bestimmte höhe und breite.
die funktion muss so fix wie möglich sein, weil sie auf ca. 200.000 bilder mit jeweils ca. 100 durchscnittswerte angewandt wird und das leidernicht einmalig.

ich dachte an scanline aber weis nicht genau, wie ich an die sache rangehen soll :/.


liebe grüße
konrad h.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Durchschnittsfarbe eines TBitmap via Scanline?

  Alt 21. Jan 2008, 20:01
Na ganz einfach:
Bitmap auf 24bit Farbtiefe einstellen, per Scanline die einzelnen Pixel auslesen und für den R, G und B-Wert getrennt den Mittelwert bilden.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Durchschnittsfarbe eines TBitmap via Scanline?

  Alt 21. Jan 2008, 20:02
Empfehlung: pf32bit nutzen und der Rest bleibt gleich.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Durchschnittsfarbe eines TBitmap via Scanline?

  Alt 21. Jan 2008, 20:15
Wieso 32bit?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Durchschnittsfarbe eines TBitmap via Scanline?

  Alt 21. Jan 2008, 20:28
nja, eigentlihch wär's doch am schnellsten, wenn er jede BitBreite unterstützt ... umrechnen braucht ja och noch Zeit.

Aber fotos sind meißt eh in 24bit vorliegend, also würde es schon reichen.


[add]
pf32bit: bestimmt wegen dem "direktem" Zugriff

32-Bit-Prozessor halt

oder wie?
$2B or not $2B
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Durchschnittsfarbe eines TBitmap via Scanline?

  Alt 21. Jan 2008, 21:37
Zitat von alzaimar:
Wieso 32bit?
Weil der Prozessor bei jedem Zugriff auf eine ungerade Adresse 2 Lesezyklen macht um den Speicherinhalt zu bekommen. Wenn es eine 32 Bit aligned Adresse ist nur einen. Somit ist bei einem pf24bit Bitmap nur jeder 4. Pixel aligned, somit ist der Zugriff mit 24 Bit deutlich langsamer als bei 32 Bit. Durch TLB und sonstiges CPU Features versucht man zwar genau diese unnötigen Zyklen zu vermeiden bzw. schon nebenbei durchzuführen, aber trotzdem ist es langsamer, auch wenn pro Pixel bei 32 Bit die Daten 8 Byte grösser sind. Das macht aber in dem Sinne nichts, da bei einer ungerade Adresse eh 64 Bit eingelesen werden um dann die unnötigen Bytes wieder weg zu werfen.

Also: Wenn es schon RGB Werte sein sollten, dann immer TRGBQuad, also pf32bit. Wir wollen der CPU ja nicht unnötig Arbeit machen, oder?
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Durchschnittsfarbe eines TBitmap via Scanline?

  Alt 21. Jan 2008, 22:13
@Muetze1: Danke. Kapiert.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Cyberstorm

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

Re: Durchschnittsfarbe eines TBitmap via Scanline?

  Alt 22. Jan 2008, 00:07
ok, danke soweit. ich werde mich mal ransetzen!
  Mit Zitat antworten Zitat
Cyberstorm

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

Re: Durchschnittsfarbe eines TBitmap via Scanline?

  Alt 22. Jan 2008, 07:07
also ich habe viel gegrübelt und stehe denk technisch immernoch vor problemen .

nochmal zum problem: ich will von vielen bildern (alle 280x210 --> 4 zu 3) durchschnittswerte von bestimmten pixelbereichen ermitteln, also sozusagen das bild gröber auflösen. dazu soll wirklich jeder pixel mit einbezogen werden. dies soll cpu technisch so schnell wie möglich passieren.
ich zeig euch einfach mal, wasich bisher an code habe:

Delphi-Quellcode:
const
  TestPointsX = 20;
  TestPointsY = 15;
  ImageHeight = 210;
type
  TRefPoints = array[1..TestPoints, 1..TestPoints] of TRGBQuad;

  TJPEGBMP = class (TJpegImage)
  public
    property Bitmap;
  end;

procedure GetRefPoints(FileName: String);
var
  t: TImage;
  i, j, x: Integer;
  P: array[1..ImageHeight] of PRGBQuad;
  average: array[1..TestPointsX, 1..TestPointsY, 1..3] of Integer;
begin
  t:=TImage.Create(nil);
  t.Picture.LoadFromFile(FileName);
  TJPEGBMP(t.Picture.Graphic).Bitmap.PixelFormat:=pf32Bit;
  for i:=1 to 210 do P[i]:=TJPEGBMP(t.Picture.Graphic).Bitmap.ScanLine[i-1];
end;
ich dachte mir, ersteinmal das komplette bild per scanline einzuscannen damit ich das nicht irgendwo doppelt machen muss.
weiterhin war meine idee, die werte für jeweils r g b in den average array zu addieren und am ende den durchschnitt für den TRefPoints array in Byte rgb werte umzurechnen.

der code klappt insoweit, dass ich zumindest per p[0].rgbRed den richtigen wert für pixel 0/0 bekomme und inc(p[0]) liefert auch korrekt pixel 1/0 usw.

bin nun aber ein wenig am verzweifeln, wie ich die schleife zum erstellen der durchscnittswerte aufziehen soll.
mir schwirren sachen wie:
Delphi-Quellcode:
for i:=1 to 210 do

  for x:=1 to TestPoints
  for i:=1 to (210 div testpoints) do
   for j:=1 to (280 div testpoints) do
    begin

    end;


   //last
  for i:=(210 - (210 mod testpoints)) to (210 mod testpoints) do
   for j:=(280 - (280 mod testpoints)) to (280 mod testpoints) do
im kopf rum aber ich kriegs einfach nicht zuende gedacht.

villeicht kann mir ja jemand auf die sprünge helfen .

grüße
konrad
  Mit Zitat antworten Zitat
Cyberstorm

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

Re: Durchschnittsfarbe eines TBitmap via Scanline?

  Alt 22. Jan 2008, 07:52
passt das?:

Delphi-Quellcode:
//alles auf 0 setzen - initialisieren
for i:=1 to TestPointsX do
 for j:=1 to TestPointsY do
  for k:=1 to 3 do
   average[i, j, k]:=0;

  for i:=1 to TestPointsX do
   for j:=1 to TestPointsY do
    for k:=1 to (280 div TestPointsX) do
      begin
       for l:=1 to (210 div TestPointsY) do
         begin
           average[i, j, 1]:=average[i, j, 1] + p[l*j-1].rgbBlue;
           average[i, j, 2]:=average[i, j, 2] + p[l*j-1].rgbGreen;
           average[i, j, 3]:=average[i, j, 3] + p[l*j-1].rgbRed;
         end;
       Inc(p[l*j-1], 1);
      end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:37 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