Leudassdf Posted July 20, 2012 Report Share Posted July 20, 2012 (edited) Boas pessoal. Gostaria de saber se e possivel alterar a cor de uma imagem. por exemplo eu pego numa imagem a cores e quero converte-la para preto e branco. É possivel? Uma duvida se depois eu quiser comparar essa imagem mas o brilho do monitor for diferente a imagem ja vai ser diferente certo? Sera melhor comparar a imagem atraves do RGB? Cumprimentos Edited July 20, 2012 by Leudassdf Link to comment Share on other sites More sharing options...
Leudassdf Posted July 20, 2012 Author Report Share Posted July 20, 2012 (edited) Resolvido. Gostaria apenas que me esclarecessem a arte da comparação de imagens. Obrigada Cumprimentos Edited July 20, 2012 by Leudassdf Link to comment Share on other sites More sharing options...
ribeiro55 Posted July 20, 2012 Report Share Posted July 20, 2012 (edited) Gostaria de saber se e possivel alterar a cor de uma imagem. por exemplo eu pego numa imagem a cores e quero converte-la para preto e branco. É possivel? Sim. Sem olhar a pesos de canal, podes simplesmente somar o valor dos 3 canais, dividir por 3 e aplicar o resultado aos 3 canais como nova cor. Se quiseres acrescentar os pesos de canal, eles são 30%, 59% e 11%. Uma duvida se depois eu quiser comparar essa imagem mas o brilho do monitor for diferente a imagem ja vai ser diferente certo? Sera melhor Não. A imagem é sempre a mesma. A forma como o monitor tas apresenta é completamente irrelevante. A comparação depende da fiabilidade que pretendes. A forma mais simples (e um pouco lenta para imagens grandes) é comparares todos os pixeis, onde o pior cenário de performance é percorrer toda a imagem (quando são iguais): For x As Integer = 0 To B1.Width - 1 For y As Integer = 0 To B1.Height - 1 If Not B1.GetPixel(x, y) = B2.GetPixel(x, y) Then MessageBox.Show("diferentes") : Exit Sub Next Next Também podes criar representações do ficheiro, e comparar as representações. Uma representação do ficheiro em Base64 por exemplo. Edited July 20, 2012 by ribeiro55 Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips" Link to comment Share on other sites More sharing options...
Leudassdf Posted July 20, 2012 Author Report Share Posted July 20, 2012 Sim. Sem olhar a pesos de canal, podes simplesmente somar o valor dos 3 canais, dividir por 3 e aplicar o resultado aos 3 canais como nova cor. Se quiseres acrescentar os pesos de canal, eles são 30%, 59% e 11%. Não. A imagem é sempre a mesma. A forma como o monitor tas apresenta é completamente irrelevante. A comparação depende da fiabilidade que pretendes. A forma mais simples (e um pouco lenta para imagens grandes) é comparares todos os pixeis, onde o pior cenário de performance é percorrer toda a imagem (quando são iguais): For x As Integer = 0 To B1.Width - 1 For y As Integer = 0 To B1.Height - 1 If Not B1.GetPixel(x, y) = B2.GetPixel(x, y) Then MessageBox.Show("diferentes") : Exit Sub Next Next Também podes criar representações do ficheiro, e comparar as representações. Uma representação do ficheiro em Base64 por exemplo. Boas Sergio Penso que o brilho tem influencia. isto orque tirei 2 printscreen exactamente iguais mas com o brilho diferente e devolve-me sempre a mensagem "diferentes". Ja agora ja tinha verificado que se usava a divisao por 3 para fazer o grayscale. Mas porque por 3? Cumprimentos Link to comment Share on other sites More sharing options...
thoga31 Posted July 20, 2012 Report Share Posted July 20, 2012 (edited) Penso que o brilho tem influencia. isto orque tirei 2 printscreen exactamente iguais mas com o brilho diferente e devolve-me sempre a mensagem "diferentes". Ja agora ja tinha verificado que se usava a divisao por 3 para fazer o grayscale. Mas porque por 3? O brilho do monitor é uma definição deste que em nada influencia as imagens. O ficheiro tem sempre os mesmos bits, o brilho é apenas uma definição do monitor em si. Outra coisa é o brilho da imagem em si. Seguindo essa lógica, quando mudas o brilho da imagem da tua televisão estás a mudar a imagem em toda a rede nacional 😛 Em suma: definições do monitor != definições (bits) da imagem. No código do Sérgio, faz uma pequena experiência. Suponho que o resultado seja o mesmo, mas nunca se sabe: If Not (B1.GetPixel(x, y) = B2.GetPixel(x, y)) Then MessageBox.Show("diferentes") : Exit Sub Ali uns parêntesis podem fazer a diferença. Não sei de cor a precedência dos operadores lógicos em VB.NET, mas em Pascal, por exemplo, é obrigatório os parêntesis porque a negação (Not) é prioritária em relação à igualdade (=). E como o VB.NET costuma fazer conversão implícita de variáveis, essa condição não dá o erro que daria no Pascal: Operator Not Overloaded, ou seja, o Not estava a influenciar um Integer e não um Boolean. var a, b : boolean; n1, n2 : integer; // ... a := false; b := false; writeln( not a = b ); // retorna "FALSE" writeln( not (a = b) ); // retorna "TRUE" n1 := 1; n2 := 2; writeln( not n1 = n2 ); // erro na compilação, "Operator Not Overloaded" writeln( not (n1 = n2) ); // retorna "TRUE" Edited July 20, 2012 by thoga31 Knowledge is free! Link to comment Share on other sites More sharing options...
Leudassdf Posted July 20, 2012 Author Report Share Posted July 20, 2012 O brilho do monitor é uma definição deste que em nada influencia as imagens. O ficheiro tem sempre os mesmos bits, o brilho é apenas uma definição do monitor em si. Outra coisa é o brilho da imagem em si. Seguindo essa lógica, quando mudas o brilho da imagem da tua televisão estás a mudar a imagem em toda a rede nacional 😛 Em suma: definições do monitor != definições (bits) da imagem. No código do Sérgio, faz uma pequena experiência. Suponho que o resultado seja o mesmo, mas nunca se sabe: If Not (B1.GetPixel(x, y) = B2.GetPixel(x, y)) Then MessageBox.Show("diferentes") : Exit Sub Ali uns parêntesis podem fazer a diferença. Não sei de cor a precedência dos operadores lógicos em VB.NET, mas em Pascal, por exemplo, é obrigatório os parêntesis porque a negação (Not) é prioritária em relação à igualdade (=). E como o VB.NET costuma fazer conversão implícita de variáveis, essa condição não dá o erro que daria no Pascal: Operator Not Overloaded, ou seja, o Not estava a influenciar um Integer e não um Boolean. var a, b : boolean; n1, n2 : integer; // ... a := false; b := false; writeln( not a = b ); // retorna "FALSE" writeln( not (a = b) ); // retorna "TRUE" n1 := 1; n2 := 2; writeln( not n1 = n2 ); // erro na compilação, "Operator Not Overloaded" writeln( not (n1 = n2) ); // retorna "TRUE" Thoga31 Obrigada pela resposta. As alteraçoes do brilho que eu faço e ao nivel do monitor mas depois para fazer a comparaçao das imagens os pixeis ja sao diferentes.E que eu tenho 2 numeros exatamente iguais mas com brilhos de monitor diferentes. mas assim torna impossivel a comparaçao. Tambem ja tentei usar ocr recognition para tentar obter o valor numero das imagens mas a imagem e demasiado pequena e nao se consegue obter esses numeros. Mas nao sei o que mais posso fazer para consegui descobrir quais os numeros naquela imagem. Alguma ideia? Cumprimentos Link to comment Share on other sites More sharing options...
thoga31 Posted July 20, 2012 Report Share Posted July 20, 2012 Thoga31 Obrigada pela resposta. As alteraçoes do brilho que eu faço e ao nivel do monitor mas depois para fazer a comparaçao das imagens os pixeis ja sao diferentes.E que eu tenho 2 numeros exatamente iguais mas com brilhos de monitor diferentes. mas assim torna impossivel a comparaçao. Tambem ja tentei usar ocr recognition para tentar obter o valor numero das imagens mas a imagem e demasiado pequena e nao se consegue obter esses numeros. Mas nao sei o que mais posso fazer para consegui descobrir quais os numeros naquela imagem. Alguma ideia? Cumprimentos Tens de entender que as definições do monitor não afectam a comparação de imagens. O programa não vai comprar os píxeis segundo o brilho do monitor, é impossível e/ou impraticável. Tendo duas imagens do tipo Bitmap ou Image, faz-se a comparação que o @sergioribeiro disse. Em princípio tudo deverá dar bem. Em último caso, salvo erro, pode-se fazer simplesmente o seguinte: If B1 IsNot B2 Then MessageBox.Show("diferentes") : Exit Sub Knowledge is free! Link to comment Share on other sites More sharing options...
Leudassdf Posted July 20, 2012 Author Report Share Posted July 20, 2012 Tens de entender que as definições do monitor não afectam a comparação de imagens. O programa não vai comprar os píxeis segundo o brilho do monitor, é impossível e/ou impraticável. Tendo duas imagens do tipo Bitmap ou Image, faz-se a comparação que o @sergioribeiro disse. Em princípio tudo deverá dar bem. Em último caso, salvo erro, pode-se fazer simplesmente o seguinte: If B1 IsNot B2 Then MessageBox.Show("diferentes") : Exit Sub Ja consegui perceber. Nao sei o porque mas no desktop nao estava a funcionar corretamente. penso que era por eu estar a gravar as imagens no desktop e ao fazer o copyfromscreen a transparencia dos programas abertos permitia a visualizaçao dos novos ficheiros o que tornava a imagem diferente. Construi um novo "comparador" e realmente funciona. Obrigada. Aproveito este topico para colocar a seguinte pergunta. Certos programas e sites ao redimensionar as suas janelas redimensionam o tamanho dos seus objectos o que por sua vez leva a uma alteraçao da posiçao de um x objecto. Sabendo que um ponto x para uma janela 500X500 se encontra no ponto x100y20 ao redimensionar para o valor 650X650 conseguimos obter a nova localizaçao do ponto x?? Cumprimentos e obrigada a todos aqueles que me ajudaram. Link to comment Share on other sites More sharing options...
thoga31 Posted July 20, 2012 Report Share Posted July 20, 2012 Nesse caso o ponto não só está numa posição diferente como se transformou num pequeno quadrado de píxeis porque aumentou a resolução. Uma regra de 3 simples resolve-te isso directamente: "Se em 500x500 está em (100;20), então em 650x650 está em (x;y)", pelo que x = 650 * 100 / 500, e o y também. O "rácio de aumento", so to speak, será 650/500 = 1,3. Knowledge is free! Link to comment Share on other sites More sharing options...
ribeiro55 Posted July 21, 2012 Report Share Posted July 21, 2012 (edited) Em offtopic, @thoga31, não podes negar uma cor, mas podes negar um teste de igualdade de cor. Naquele caso não eram necessários parêntesis. Se houvessem mais testes lógicos encadeados, sim. @Leudassdf, por a tua lógica, se eu desligar o monitor, os pixeis são todos pretos? 😛 Até podes fazer CopyFromScreen e as tuas comparações todas com o monitor desligado, mesmo da placa gráfica, que o resultado vai ser o mesmo. Edited July 21, 2012 by ribeiro55 Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips" Link to comment Share on other sites More sharing options...
Leudassdf Posted July 21, 2012 Author Report Share Posted July 21, 2012 Em offtopic, @thoga31, não podes negar uma cor, mas podes negar um teste de igualdade de cor. Naquele caso não eram necessários parêntesis. Se houvessem mais testes lógicos encadeados, sim. @Leudassdf, por a tua lógica, se eu desligar o monitor, os pixeis são todos pretos? 😛 Até podes fazer CopyFromScreen e as tuas comparações todas com o monitor desligado, mesmo da placa gráfica, que o resultado vai ser o mesmo. Realmente nao sabia que se podia tirar um print do ecra com o monitor desligado. nunca precisei:D Mas obrigada pela informaçao. Se eu mudar a resoluçao do monitor e copiar num ponto especifica sempre com o mesmo tamanho as duas imagens vao fiar iguais a mesma certo? ou seja se eu tirar 2 prints exatamente a mesma "coisa" mas com resoluções diferentes as imagens vao ser iguais a mesma correto? Por ex se fizer um print com comprimento 30 e altura 30 a partir do mesmo ponto 0-0 com uma resoluçao de 1920-1080 e o seguinte print for com a resoluçao 1280-800 a imagem vai ser exactamente igual correto? Outra coisa as cores do ecra vao ser sempre iguais independentemente da placa grafica? por exemplo se tiver uma cor 255-0-0 vermelho, noutro computador com uma placa grafica diferente ela ficara sempre 255-0-0 ou seja os pixeis irao ser iguais certo? Obrigada por tuda a ajuda que me prestaram, e os excelentes esclarecimentos. 🙂 Link to comment Share on other sites More sharing options...
thoga31 Posted July 21, 2012 Report Share Posted July 21, 2012 Tu confundes muito 1) monitor, 2) placa gráfica e 3) ficheiro de imagem. O computador irá enviar informações gráficas para a placa gráfica e esta, por sua vez, tradu-las de forma a que o monitor as entenda e reproduza em pontinhos de luz para que o ser humano compreenda (pixeis). Como é que a imagem do desktop chega ao monitor? Não é o monitor que a produz: o OS produ-la de uma forma que é traduzida em imagem pela GPU e que o monitor a traduz em luz visível. Na essência, qualquer imagem mostrada pelo monitor é a tradução de um calhamaço de bits para luz visível. Por isso, um Print Screen obtém os bits do momento que definem a imagem actual, quer o monitor esteja ligado ou desligado. O monitor só recebe informação, não envia - é um dispositivo só de output. Então tu tens uma imagem JPG. Mete-la numa pen. Agora vais a um PC que está ligado a um monitor que tem o brilho definido a muito elevado a gosto do utilizador. Depois colocas a pen noutro PC, como o meu, que tem muito menos brilho porque a mim muito brilho fere-me os olhos. O ficheiro JPG modificou? Claro que não! A modificação de imagem que ocorreu de um monitor para o outro ocorre já no monitor: é como uma televisão - o sinal é o mesmo, a imagem só muda consoante as definições locais. Se eu quiser, posso metê-la a P&B! Mas eu recebo o sinal a cores. O monitor é o mesmo: recebe o sinal "real" e adapta consoante as suas próprias modificações locais - brilho, contraste, posição, etc etc... Está isto devidamente esclarecido? 🙂 Em offtopic, @thoga31, não podes negar uma cor, mas podes negar um teste de igualdade de cor. Naquele caso não eram necessários parêntesis. Se houvessem mais testes lógicos encadeados, sim. Pois, eu não me recordo bem como é em VB.NET, mas em Pascal aquele Not daria erro na compilação. Por isso é que falei avisando que não tinha certezas. Assim já fiquei a saber, obrigado 🙂 Knowledge is free! Link to comment Share on other sites More sharing options...
Leudassdf Posted July 22, 2012 Author Report Share Posted July 22, 2012 Tu confundes muito 1) monitor, 2) placa gráfica e 3) ficheiro de imagem. O computador irá enviar informações gráficas para a placa gráfica e esta, por sua vez, tradu-las de forma a que o monitor as entenda e reproduza em pontinhos de luz para que o ser humano compreenda (pixeis). Como é que a imagem do desktop chega ao monitor? Não é o monitor que a produz: o OS produ-la de uma forma que é traduzida em imagem pela GPU e que o monitor a traduz em luz visível. Na essência, qualquer imagem mostrada pelo monitor é a tradução de um calhamaço de bits para luz visível. Por isso, um Print Screen obtém os bits do momento que definem a imagem actual, quer o monitor esteja ligado ou desligado. O monitor só recebe informação, não envia - é um dispositivo só de output. Então tu tens uma imagem JPG. Mete-la numa pen. Agora vais a um PC que está ligado a um monitor que tem o brilho definido a muito elevado a gosto do utilizador. Depois colocas a pen noutro PC, como o meu, que tem muito menos brilho porque a mim muito brilho fere-me os olhos. O ficheiro JPG modificou? Claro que não! A modificação de imagem que ocorreu de um monitor para o outro ocorre já no monitor: é como uma televisão - o sinal é o mesmo, a imagem só muda consoante as definições locais. Se eu quiser, posso metê-la a P&B! Mas eu recebo o sinal a cores. O monitor é o mesmo: recebe o sinal "real" e adapta consoante as suas próprias modificações locais - brilho, contraste, posição, etc etc... Está isto devidamente esclarecido? 🙂 Pois, eu não me recordo bem como é em VB.NET, mas em Pascal aquele Not daria erro na compilação. Por isso é que falei avisando que não tinha certezas. Assim já fiquei a saber, obrigado 🙂 Sim está. obrigada.... Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now