Questão É possível converter JPEG para um formato sem perdas e convertê-lo de volta sem perder qualidade?


Digamos que eu tenha uma versão sem perdas de uma imagem que tenha sido previamente compactada no formato JPEG (como se você abrisse uma imagem JPEG em mspaint e a 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 de volta para o formato JPEG sem perder a qualidade da imagem, o que significa que cada pixel é exatamente o mesmo?

EDITAR: Compreendo perfeitamente que a conversão de uma imagem JPEG para um formato sem perdas não me dará nenhuma qualidade extra. Estou perguntando isso porque: Eu tenho um arquivo PNG extraído de um arquivo SWF. Originalmente (no arquivo SWF) o objeto era imagem JPEG + alpha channal, cujo tamanho do arquivo é muito menor em comparação ao arquivo PNG que eu tenho. Eu quero o formato original (JPEG + canal alfa), mas eu não tenho mais nenhuma cópia do arquivo SWF original (e eu não consegui encontrar um on-line também), então não posso refazer o processo de extração.


2


origem


Isso é realmente apenas sobre o seu entendimento ou você quer fazer isso (e em caso afirmativo, por que)? - Dave
Eu ainda não entendi o seu problema - mas Como regra geral, qualquer codificação com perda (adicional) reduz a qualidade - é apenas um cenário de melhor caso que não pode ser alcançado sem muito esforço (ajuste manual de parâmetros, usando "as melhores" ferramentas, ...) para obter a mesma qualidade de uma compressão com perdas. E como o JPEG não oferece muito ajuste fino ... Então a resposta é: não. No entanto, é possível que a perda adicional de qualidade não seja visível - mas isso é algo que você precisa experimentar, porque realmente depende dos formatos usados ​​(codificadores), da imagem em questão e do caso de uso. - flolilolilo


Respostas:


JPEG é um formato com perdas e não há maneira de contornar isso. Mesmo com a qualidade de compressão de 100, a taxa de compressão ainda é de 2,6: 1 (Wikipedia JPEG).

Houve algumas variantes propostas para JPEG sem perdas, como JPEG 2000, mas eles não pegaram e seu apoio é muito pobre.

Seria melhor você converter para um formato sem perdas, como PNG, que ainda comprime mas sem perda.


3



Normalmente sim, embora no processo jpg -> png -> jpg, seja teoricamente possível que o processo png -> jpg aplique o mesmo método de compressão que o que produziu o jpg original. No entanto, na prática, isso é quase impossível de propósito. Além disso, se houve até mesmo uma pequena edição, isso quase sempre resulta na segunda compactação jpg lutando para compactar os artefatos jpg da primeira compactação que não se alinham corretamente. - BeowulfNode42


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 da de um codificador JPEG convencional, e Não tenho conhecimento de nenhum software que faça isso. Matematicamente, isso é possível * desde que a imagem não tenha 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 cor - o JPEG usa subamostragem (a amostra de cor sobre um grupo de pixels), enquanto um bitmap é RGB. Perdas inevitáveis ​​convertendo entre esses espaços de cor (e também em qualquer ajuste de gama) introduzem ruído. O segundo problema a ser resolvido é o JPEG registra os dados da imagem como macroblocos (sub-imagens NxN), que devem ser inferidas da imagem de saída do decodificador. Uma explicação mais detalhada do formato JPEG e do processo de codificação pode ser encontrada aqui http://www.guillermito2.net/stegano/jsteg/

'un-decoding' a 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 do Coseno (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 comuns de JPEG foram usadas para criar a imagem e tente aplicá-las até encontrar uma que tenha resultados semelhantes ao JPEG do DCT (geralmente zeros para altas frequências).

Depois disso, ajuste os coeficientes para um erro mínimo comparado ao original (ou seja, bitmap da imagem compactada). Este processo ainda irá resultar em troca entre erro e tamanho do arquivo, mas deve chegar perto o suficiente para fins práticos.

Fonte: Emprego anterior verificando os codecs de vídeo DNx e ProRes, que aplicam codificação semelhante a JPEG a cada quadro individual (o software que reverte os quadros decodificados teria sido um projeto paralelo muito interessante e potencialmente útil).

* Existe um conjunto de dados de entrada que produzirá saída idêntica quando passado pelo decodificador JPEG original, no entanto, é altamente improvável que qualquer reconstrução seja uma cópia em bytes (ignorando metadados) do arquivo original porque a informação foi perdida durante a decodificação processo.


3





A informação quase certamente foi perdida convertendo para um JPEG. Converter esse arquivo em um BMP preservará as informações armazenadas no JPEG, mas converter o BMP novamente em JPEG provavelmente fará com que você perca ainda mais informações


0





Se você abrir uma imagem JPEG com qualquer editor e salvá-la como BMP, não terá mais qualidade do que a que já está disponível no seu .jpg Arquivo. Isso seria como converter um arquivo mp3 de baixa taxa de bits (por exemplo, 128kbps) para um formato muito melhor como flac, esperando que de alguma forma a qualidade fosse magicamente restaurada. Não vai.

As informações foram perdidas quando você salvou a imagem pela primeira vez em jpg, como harrymc disse; não há como recuperar essa informação desse arquivo jpg.

A compactação com perdas é "destrutiva" ou também conhecida como "irreversível". Vejo https://en.wikipedia.org/wiki/Lossy_compression.


0