Einzelnen Beitrag anzeigen

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