-1

.Jpeg Image 600x600を分析しようとしていますが、RED値が230を超え、Green値が200を超えている場所を教えてほしいのです。現在、このプロジェクトを進めていますが、反復するのに時間がかかりすぎます。画像全体、およびピクセルカラーの奇妙な値を取得します(Color= + inttostr(RGB))。誰かが私に手を貸してくれませんか?

type
  PRGBTripleArray = ^TRGBTripleArray;
  TRGBTripleArray = array[0..4095] of TRGBTriple;

procedure TForm2.Button1Click(Sender: TObject);
var
  RGB: Byte;
  X, Y: Integer;
  R, G, B: Byte;
  Bitmap1: TBitmap;
  ColorRGB: LongInt;
  Pixels: PRGBTripleArray;
begin
  Memo1.Lines.Clear;
  Bitmap1 := TBitmap.Create;
  try
    Bitmap1.Assign(Image1.Picture.Graphic);

    for Y := 0 to Bitmap1.Height - 1 do
    begin
      Pixels:= Bitmap1.ScanLine[Y];

      Memo1.Lines.Add('======================');
      Memo1.Lines.Add('Line # ' + IntToStr(Y));
      Memo1.Lines.Add('======================');

      for X := 0 to Bitmap1.Width - 1 do
      begin
        ColorRGB := ColorToRGB(Bitmap1.Canvas.Pixels[x, y]);
        R := GetRValue(ColorRGB);
        G := GetGValue(ColorRGB);
        B := GetBValue(ColorRGB);
        RGB:= R*G*B;

        Memo1.Lines.Add(
                'line='    + IntToStr(Y)
              + ' row='    + IntToStr(X)
              + ' Colour=' + IntToStr(RGB)
              + ' Red='    + IntToStr (R) // red
              + ' Green='  + IntToStr (G) // blue
              + ' Blue='   + IntToStr (B) // green
        )
      end;
    end;
  finally
    Bitmap1.free;
  end;
end;

end.
4

1 に答える 1

3

赤のチャネル値が230を超え、緑の値が200を超える、ビットマップのすべてのピクセルをログに記録する場合は、次を使用できます。頻繁な更新の可能性をロックするためにBeginUpdateEndUpdateペアを使用することを忘れないでください。TMemo.Lines

とにかく、あなたはまだ2つのビットマップピクセルアクセス技術を一緒に混ぜています。Canvas.Pixels大きなピクセル配列の操作には使用しないでください。それは非常に非効率的です。そのためにのみ使用ScanLineしてください:

type
  PRGBTripleArray = ^TRGBTripleArray;
  TRGBTripleArray = array[0..4095] of TRGBTriple;

procedure TForm1.Button1Click(Sender: TObject);
var
  C: TColor;
  X: Integer;
  Y: Integer;
  Bitmap: TBitmap;
  Pixels: PRGBTripleArray;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.Assign(Image1.Picture.Graphic);

    Memo1.Lines.BeginUpdate;
    try
      for Y := 0 to Bitmap.Height - 1 do
      begin
        Pixels := Bitmap.ScanLine[Y];
        for X := 0 to Bitmap.Width - 1 do
        begin
          if (Pixels[X].rgbtRed > 230) and (Pixels[X].rgbtGreen > 200) then
          begin
            C := RGB(
              Pixels[X].rgbtRed,
              Pixels[X].rgbtGreen,
              Pixels[X].rgbtBlue
            );
            Memo1.Lines.Add(
              '===============' + sLineBreak +
              'Pixel[' + IntToStr(X) + '; ' + IntToStr(Y) + ']' + sLineBreak +
              'Color: ' + ColorToString(C) + sLineBreak +
              'Red channel: ' + IntToStr(Pixels[X].rgbtRed) + sLineBreak +
              'Green channel: ' + IntToStr(Pixels[X].rgbtGreen) + sLineBreak +
              'Blue channel: ' + IntToStr(Pixels[X].rgbtBlue)
            );
          end;
        end;
      end;
    finally
      Memo1.Lines.EndUpdate;
    end;
  finally
    Bitmap.Free;
  end;
end;
于 2013-02-26T19:43:54.710 に答える