Fórum Pixels comuns a duas imagens #288570
18/07/2005
0
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
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
Curtir tópico
+ 0
Responder
Posts
19/07/2005
Beppe
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.
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.
Responder
Gostei + 0
19/07/2005
Daemon
..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:
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:
...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
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
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)