
Digamos que eu tenha uma versão sem perdas de uma imagem que foi previamente compactada no formato JPEG (como se você abrisse uma imagem JPEG no mspaint e salvasse como BMP, sei que alguns metadados seriam perdidos nesse processo, mas isso não é da minha conta)
Gostaria de saber se é possível e como convertê-lo novamente para o formato JPEG sem perder a qualidade da imagem, ou seja, cada pixel é exatamente igual?
EDITAR:Entendo perfeitamente que converter uma imagem JPEG para um formato sem perdas não me proporcionará nenhuma qualidade extra. Estou perguntando isso porque: tenho um arquivo PNG extraído de um arquivo SWF. Originalmente (no arquivo SWF) o objeto era imagem JPEG + canal alfa, cujo tamanho do arquivo é muito menor comparado ao arquivo PNG que tenho. Quero o formato original (JPEG + canal alfa), mas não tenho mais nenhuma cópia do arquivo SWF original (e também não consegui encontrar uma on-line), portanto não posso refazer o processo de extração.
Responder1
O que você está perguntando, essencialmente, é se o processo de decodificação de uma imagem JPEG pode ser revertido. Esta é uma intenção muito diferente daquela de um codificador JPEG convencional eNão tenho conhecimento de nenhum software que faça isso.Matematicamente isso é possível* desde que a imagem não tenha tido uma transformação ou outra modificação aplicada após ter sido codificada, mas programaticamente quão difícil poderia ser?
O primeiro problema é o espaço de cores - o JPEG usa yCbCr subamostrado (a cor amostrada em um grupo de pixels), enquanto um bitmap é RGB. Perdas inevitáveis na conversão entre esses espaços de cores (e também em qualquer ajuste de gama) introduzem ruído. O segundo problema a resolver é que o JPEG registra os dados da imagem como macroblocos (subimagens de tamanho NxN), que devem ser inferidos a partir da imagem de saída do decodificador. Uma explicação mais detalhada do formato JPEG e do processo de codificação pode ser encontrada aquihttp://www.guillermito2.net/stegano/jsteg/
'descodificar' um JPEG:
Para criar uma aproximação dos dados JPEG originais, precisamos encontrar a subamostragem, o tamanho e o alinhamento dos macroblocos e os coeficientes da Transformada Discreta de Cosseno (DCT) que foram usados para codificá-los. O resto é idêntico a um processo normal de codificação JPEG. Uma implementação ingênua que vem à mente é "adivinhar e verificar": suponha que algumas implementações JPEG comuns foram usadas para criar a imagem e tente aplicá-las até encontrar uma que tenha resultados 'semelhantes a JPEG' do DCT (normalmente zeros para altas frequências).
Depois disso, ajuste os coeficientes para obter um erro mínimo em comparação com o original (ou seja, bitmap da imagem compactada). Esse processo ainda resultará em uma compensação entre erro e tamanho do arquivo, mas deve chegar próximo o suficiente para fins práticos.
Fonte: Emprego anterior na verificação de codecs de vídeo DNx e ProRes, que aplicam codificação semelhante a JPEG a cada quadro individual (um software que reverte quadros decodificados teria sido um projeto paralelo muito interessante e potencialmente útil).
* Existe um conjunto de dados de entrada que produzirá uma saída idêntica quando passado pelo decodificador JPEG original; no entanto, é altamente improvável que qualquer reconstrução seja uma cópia byte a byte (ignorando os metadados) do arquivo original porque as informações foram perdidas durante a decodificação processo.
Responder2
JPEG é um formato com perdas e não há como contornar isso. Mesmo com qualidade de compactação de 100, a taxa de compactação ainda é de 2,6:1 (Wikipédia JPEG).
Houve algumas variantes propostas paraJPEG sem perdas, como o JPEG 2000, mas eles não pegaram e seu suporte é muito fraco.
Seria melhor converter para um formato sem perdas, como png, que ainda comprime, mas sem perda.
Responder3
Se você abrir uma imagem JPEG com qualquer editor e salvá-la como BMP, não obterá mais qualidade do que já está disponível em seu .jpg
arquivo. Isso seria como converter um arquivo mp3 com baixa taxa de bits (por exemplo, 128 kbps) para um formato muito melhor como flac
, esperando que de alguma forma a qualidade fosse restaurada magicamente. Não vai.
As informações foram perdidas quando você salvou a imagem em jpg pela primeira vez, como harrymc disse; não há como recuperar essas informações deste arquivo jpg.
A compactação com perdas é "destrutiva" ou também conhecida como "irreversível". Verhttps://en.wikipedia.org/wiki/Lossy_compression.
Responder4
É quase certo que as informações foram perdidas na conversão para JPEG. A conversão desse arquivo para BMP preservará as informações armazenadas no JPEG, mas a conversão do BMP de volta para JPEG provavelmente fará com que você perca ainda mais informações.