Pixels comuns a duas imagens

Delphi

18/07/2005

Olá!

Tenho um bitmap dentro de um TImage, que possui partes da cor branca, que nao fazem parte do desenho (por exemplo, uma figura em forma cruz). Quando um outro bitmap dentro de outro TImage encosta neste primeiro bitmap, quero verificar se ele encostou realmente na figura, ou se encostou nestas partes em branco (neste caso, ele nao encostou na imagem real). Estava pensando em verificar se todos os pixels que fazem parte da interseção entre essas duas imagens eram brancos em qualquer uma destas imagens, e se fosse, eu consideraria que as imagens não se encostaram realmente. Alguem ve uma maneira melhor de fazer isso?
Caso essa seja a melhor maneira, tenho outro problema:
Como descobrir quais as cores dos pixels que fazem parte desta interseção? Não consigo usar a propriedade Canvas.Pixel[x,y], porque este x e y são relativos à cada imagem, e não da pra saber quando eles ocupam a mesma posicao relativos à janela que contem as imagens. Agradeco muito a ajuda de todos!

Ate mais!

Jose Gustavo


Joeygustavo

Joeygustavo

Curtidas 0

Respostas

Beppe

Beppe

18/07/2005

Oi!

Se as imagens forem fechadas dá pra fazer do jeito que pede,pois é mais simples, mas se conterem buracos aí complica, uma solução seria criar [i:44199509b7]regions[/i:44199509b7] e ver se elas interseccionam.

No caso dos pixels, pode computar a posição dos pixels na tela somando os TImage.Left e TImage.Top do TImage correspondente.


GOSTEI 0
Daemon

Daemon

18/07/2005

..o lance é o seguinte.. ...o lance de ver o top e o left da imagem não vai funcionar, por exemplo no caso de uma imagem 1 que for uma cruz e uma imagem 2 que esteja encostando o meio da imagem nela, o lance que pode te dar uma tentativa eh o seguinte:

function TForm1.BitmapToRegion(bmp: TBitmap) : dword;
var ix,iy : integer; // loop nas variáveis
tc : TColor; // transparentColor
b1 : boolean; // está olhando o "real" pixels (no transparent pixels)
c1 : cardinal; // ajusta a variável na região
i1 : integer; // primeira posição real em pixel
begin
  Result := 0;
  i1 := 0;
  // memória do transparent color
  tc := bmp.transparentColor and $FFFFFF;
  with bmp.canvas do
  // enquadrilhe por todas as linhas
  for iy := 0 to bmp.height - 1 do
  begin
    b1 := False;
    // esquadrinhe por todo o pixels nesta linha
    for ix:=0 to bmp.Width - 1 do
    // feito nós acharmos o começo/final seguidos em pixel
    if (pixels[ix, iy] and $FFFFFF <> tc) <> b1 then begin
      // sim, e foi o último pixel,
      // so nós podemos somar uma região de estilo de linha. . .
      if b1 then begin
        c1:=CreateRectRgn(i1,iy,ix,iy+1);
        if result<>0 then
        begin
          // Esta não é a primeira região
          CombineRgn(Result, Result, c1, RGN_OR);
          DeleteObject(c1);
          // Esta é a primeira região
        end
        else
        Result := c1;
      end else i1 := ix;
      // mude o modo e procura o primeiro ou último pixel?
      b1:=not b1;
    end;
    // o último pixel nesta fila era um pixel real?
    if b1 then begin
      c1:=CreateRectRgn(i1, iy, bmp.width-1, iy+1);
      if (Result <> 0) then
      begin
        CombineRgn(Result, Result, c1, RGN_OR);
        DeleteObject(c1);
      end
      else
      Result := c1;
    end;
  end;
end;


esse código (ACIMA) eu achei no forum, eh uma função que converte um BitMap em Região, usando ele eu fiz o seguinte código:


var
  img1Rgn: DWord;
  x, y, tX, tY:Integer;
  bDentro: Boolean;
begin

  bDentro := False;
  img1Rgn := BitmapToRegion(image1.Picture.Bitmap);
  for X := 0 to image2.Picture.Width -1 do
    for y := 0 to image2.Picture.Height -1 do
    begin
      tX := image2.ClientOrigin.X + X;
      tY := image2.ClientOrigin.y + Y;
      bDentro := bDentro or PtInRegion(img1Rgn, tX, tY);
    end;

end;



...sendo que ´PtInRegion´ é uma função do Windows que verifica se determinado pixel esté dentro de determinada região, acho que o código acima deve te dar uma indicação de por onde começar..........
...flws


GOSTEI 0
POSTAR