Leudassdf Posted July 20, 2012 at 11:04 AM Report #469353 Posted July 20, 2012 at 11:04 AM (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 at 11:06 AM by Leudassdf
Leudassdf Posted July 20, 2012 at 11:40 AM Author Report #469360 Posted July 20, 2012 at 11:40 AM (edited) Resolvido. Gostaria apenas que me esclarecessem a arte da comparação de imagens. Obrigada Cumprimentos Edited July 20, 2012 at 11:41 AM by Leudassdf
ribeiro55 Posted July 20, 2012 at 01:42 PM Report #469377 Posted July 20, 2012 at 01:42 PM (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 at 01:45 PM 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"
Leudassdf Posted July 20, 2012 at 07:50 PM Author Report #469432 Posted July 20, 2012 at 07:50 PM 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
thoga31 Posted July 20, 2012 at 09:43 PM Report #469438 Posted July 20, 2012 at 09:43 PM (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 at 09:43 PM by thoga31 Knowledge is free!
Leudassdf Posted July 20, 2012 at 10:13 PM Author Report #469445 Posted July 20, 2012 at 10:13 PM 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
thoga31 Posted July 20, 2012 at 10:20 PM Report #469449 Posted July 20, 2012 at 10:20 PM 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!
Leudassdf Posted July 20, 2012 at 11:02 PM Author Report #469456 Posted July 20, 2012 at 11:02 PM 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.
thoga31 Posted July 20, 2012 at 11:07 PM Report #469457 Posted July 20, 2012 at 11:07 PM 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!
ribeiro55 Posted July 21, 2012 at 11:35 AM Report #469494 Posted July 21, 2012 at 11:35 AM (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 at 11:36 AM 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"
Leudassdf Posted July 21, 2012 at 12:38 PM Author Report #469499 Posted July 21, 2012 at 12:38 PM 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. 🙂
thoga31 Posted July 21, 2012 at 09:10 PM Report #469586 Posted July 21, 2012 at 09:10 PM 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!
Leudassdf Posted July 22, 2012 at 09:27 AM Author Report #469628 Posted July 22, 2012 at 09:27 AM 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....
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