As rotações do “Windows Photo Viewer” não têm perdas?

58

Posso girar fotos compactadas com perda que visualizo no Windows Photo Viewer sem me preocupar em perder ainda mais informações na compactação?


fonte
11
Observe que - até onde eu sei - uma rotação de 90 graus (e 180, 270) é sem perdas por si só porque é uma troca de coordenadas xey (outros ângulos requerem interpolação). Portanto, qualquer perda atribuída à transformação é da recompressão. Você pode evitar isso recomputation salvando a imagem transformada em um formato lossless, mas isso não é claramente parte da sua pergunta, então eu não vou sugerir isso
horatio
5
@horatio, os múltiplos de 90 graus são um caso especial para a compactação JPG, onde é tecnicamente possível girar a imagem sem um ciclo de compactação "simplesmente" reorganizando os dados compactados. Envolve remover e aplicar uma camada de compactação sem perdas, portanto o tamanho do arquivo pode mudar, mas nenhuma operação com perdas é necessária.
RBerteig
11
Acho que entendo você, mas o que quero dizer é que o jpeg é um formato de armazenamento em disco e não tem nenhuma influência na qualidade das transformações. Ou seja, embora se fale frequentemente de trabalhar com jpegs etc., enquanto o arquivo é exibido na tela e manipulado, não é um jpeg.
Horatio 24/05
11
Cara, eu sempre quis saber a resposta para esta pergunta. IMO eles deveriam ser. Mas provavelmente devido ao padrão JPEG ... acho que não é tecnicamente possível tornar essa operação sem perdas.
Trevor Boyd Smith
2
O visualizador de imagens do Google Picasa NÃO tem perdas. mas engana. não gira a imagem. apenas marca nos metadados "exibir esta imagem girada".
Trevor Boyd Smith

Respostas:

64

Se as dimensões da imagem são múltiplos de 8 (ou 16 se a subamostragem de croma é usada), as rotações são sem perdas. Caso contrário, não é possível girar a imagem sem recalcular os blocos, ou seja, recomprimir a imagem, o que é prejudicial.

A razão para isso é que as imagens JPEG são divididas em uma série de blocos 8x8 ou 16x16, que são compactados individualmente. Blocos incompletos são permitidos apenas nas margens direita e inferior. Assim, sua imagem não é um múltiplo exato de 8/16; ela conterá blocos incompletos, que terminarão na borda errada após a rotação.

Eu verifiquei a afirmação acima usando a versão do Windows Photo Viewer que acompanha o Windows 7. Usei duas imagens de ruído colorido. Uma imagem tinha 256x256, ou seja, múltiplos tamanhos de 8. A outra imagem era a mesma, mas cortada para 253x253, ou seja, nenhum tamanho era múltiplo de 8. Aqui estão as imagens:

256x256

253x253

Em seguida, realizei quatro rotações no sentido anti-horário, fechando o visualizador de fotos após cada rotação para garantir que a imagem foi salva no estado rotacionado.

256x256

253x253

Não é necessário fazer uma subtração para ver a diferença na imagem de 253 pixels, é visivelmente mais escura e mais confusa!

Um diff na outra imagem fica assim:

ou seja, as imagens são idênticas, as rotações foram sem perdas.

Matt Grum
fonte
11
Eu sei que no passado, quando eu fiz rotações, ele me avisou que a rotação seria com perdas, o que implica que, nos casos em que o aviso não era exibido, a transformação era sem perdas, mas eu não verifiquei. Também não me lembro de qual versão do WPV eu estava usando, sem excluir a possibilidade de o MS ter alterado a base de código; portanto, não tenho certeza.
Matt Grum
11
@ Uma imagem de ruído puro é, por definição, o pior caso para jpeg (ou qualquer algoritmo de compressão), e é por isso que eu o escolhi! Os resultados em imagens reais ficariam melhores.
Matt Grum
11
@MattGrum, demo muito legal. Espero que todos os fabricantes de câmeras digitais tenham seus tamanhos de imagem em múltiplos inteiros de 8!
Trevor Boyd Smith
11
@MattGrum Eu costumava trabalhar na equipe do WPV. AFAIK, (e tenho certeza) que sua resposta está correta. Além disso, um por um método muito completo de provar sua hipótese:)
Tristan
@TrevorBoydSmith todas as câmeras que eu vi têm dimensões de imagem que são um múltiplo de 8 ou 16. A rotação não é necessariamente o motivo, pode apenas permitir alguma otimização do pipeline JPEG.
Mark Ransom