[Delphi] Подсчитать коло-во пикселей черного цвета на фото

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by onlyFashion, 18 Aug 2012.

  1. onlyFashion

    onlyFashion New Member

    Joined:
    30 Jan 2012
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0
    Пишу такой код, но изображение не появляется на Image1. В чем может быть проблем?

    Code:
    uses
      IdHTTP, Jpeg, ...
    
    
     TNewThread = class(TThread)
      private
      protected
      procedure Execute; override;
      end;
    
    var
      Form1: TForm1;
      thr:TNewThread;
    
    implementation
    
    {$R *.dfm}
    
    procedure TNewThread.Execute;
    var  
      z,r,x: Integer;  
      http: TIdHttp;  
      ms: TMemoryStream; 
      jpeg: TJpegImage;  
    begin        
        http := TIdHTTP.Create(nil);        
        ms := TMemoryStream.Create;       
        jpeg := TJpegImage.Create;        
        BMP := TBItmap.Create();    
    
     http.Get('тут моя ссылка на фото.jpg, ms);      
     ms.Position := 0;      
     jpeg.LoadFromStream(ms);      
     Form1.Image1.Picture.Graphic := jpeg;     
     BMP.Assign(Form1.Image1.Picture.Graphic);    
    
     x:=0   
     
    for z:=0 to BMP.Width do    
    for r:=0 to BMP.Height do    
    if BMP.Canvas.Pixels[z,r]=clBlack then       
     begin        
    x:=x+1;       
     end;    
    
    Form1.Memo2.Lines.Add(x)
    
    jpeg.Free; 
    ms.Free; 
    http.Free;
    BMP.Free;
    
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    thr:=TNewThread.Create(True);
    thr.FreeOnTerminate:=True;
    thr.Priority:=tpNormal;
    thr.Resume;
    end;
    
     
  2. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    пробуй так через synhronize

    и... вариант сравнения пикселей
    Code:
    function PixelCountFromColor(Bitmap: TBitmap; Color: TColor; 
      MaxDelta: Integer = 0): Integer;
    
      function IsTheColor(AColor: TColor): Boolean;
      var
        I: Integer;
      begin
        Result := True;
        for I := 1 to 3 do
          Result := Result 
            and (Abs(TWordDynArray(AColor)[I] - TWorDynArray(Color)) < MaxDelta);
      end;
      
    var
      I, J: Integer;
    begin
      Result := 0;
      with Bitmap do
        for I := 0 to Bitmap.Width -1 do
          for J := 0 to Bitmap.Heigh -1 do
            if IsTheColor(Bitmap.Canvas.Pixel[I, J]) then
              Inc(Result);
    end;
    
    
    function PixelCountFromColorJPGStream(Stream: TStream; Color: TColor; 
      MaxDelta: Integer = 0): Integer;
    begin
      with TJPGImage.Create do
      try
        Bitmap.LoadFromStream(Stream);
        Result := PixelCountFromColor(Bitmap, Color, MaxDelta);
      finally
        Free;
      end;
    end;
    
     
  3. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    аа... вы, наверное, грузите не тот формат (напр JPG вместо PNG).
    чтобы IDE автоматически подключило нужные библиотеки нужно вручную (до компиляции) вставить изображение в TImage