Como obtenho a junção sem perda de JPEG sem o truncamento de MCUs parciais?

6

Estou trabalhando em um projeto para o qual preciso juntar milhares de imagens JPEG losslessly (não estou falando sobre o JPEG / JPEG 2000 / JPEG sem perdas LS formata aqui).

As imagens acima mencionadas têm níveis variáveis de subamostragem de crominância (1x1, 1x2, 2x1, 2x2), resultando em tamanhos variáveis de MCU (8x8, 8x16, 16x8, 16x16 px). No entanto, em qualquer conjunto de imagens a serem unidas, cada imagem tem características idênticas.

Por enquanto, vamos supor que eu tenha apenas duas imagens. A imagem # 1 ( I1 ) tem 256x256px e # 2 ( I2 ) tem 239x256px. A subamostragem 2x2 é usada de tal forma que o tamanho do MCU é 16x16px. I2 então obviamente tem MCUs parciais na borda direita, já que sua largura não é divisível por 16. (Eu li que os MCUs 'parciais' na verdade contêm os dados para uma MCU completa, mas as dimensões da imagem instruem o renderizador a exibir apenas os pixels relevantes e ignorar / ocultar os extras.)

Procurando ferramentas que poderiam me ajudar a fazer isso, deparei-me com uma versão modificada do JpegTran , que contém um cultivo experimental sem perdas Recurso 'n' drop (cortar e colar). Todos os outros aplicativos que eu encontrei que suportam a edição JPEG sem perdas parecem utilizar o código do IJG (JpegTran), então essa parecia ser a escolha lógica. Além disso, considerando o grande número de imagens, eu queria algo que pudesse ser executado preferencialmente a partir da linha de comando, para que eu pudesse automatizar o processo com um script.

Infelizmente, enquanto tudo funcionava bem, parece que o JpegTran trunca os MCUs parciais em vez de retê-los. Assim, no exemplo acima, a imagem final associada contém todos os I1 , mas apenas 224x256px de I2 . Por que 224? porque 239 = 14x16 + 15, o que significa que há 14 MCUs completos ao longo da largura e 1 MCU parcial (apenas 1px abaixo do 16px completo). O último 15px é o que está ficando em branco, levando a uma imagem de 495x256px com 15px de pixels em branco (cinza) na borda direita. Veja as imagens abaixo (pena que imgur as comprima novamente):

(àesquerda)+ (direita)

=

Comovocêpodeverclaramente,apartevermelha(15px)deI2foitruncadaporJpegTran.SeosMCUstivessem8pxdelargura,aparteperdidateriasidoo7pxdeI2maisàdireita.Damesmaforma,unirI3(256x239px)*abaixode*I1causariaaperdade7ou15px,dependendodaalturadoMCU,éclaro:

(topo) + (abaixo)

=

  • O que eu estou tentando fazer é mesmo, ou o chamado 'cortar' JPEG 'sem perdas' só é válido para imagens sem MCUs parciais? (Talvez seja por isso que o recurso ainda está em um "estado experimental" mais de uma década depois de ser apresentado ...)

  • Até que eu saiba com certeza que é impossível, eu não estou interessado em sugestões para ingressos com perdas. Evitar qualquer perda de geração é a única razão pela qual estou quebrando minha cabeça sobre isso, senão eu teria feito e espanado há muito tempo. Além disso, não estou interessado em sugestões relacionadas à mudança de formatos de imagem. Eu não controlo a origem das imagens.

  • Se isso puder ser feito, como? Por favor, tenha em mente que quaisquer aplicativos alternativos sugeridos devem, idealmente, ser capazes de automação, dados os requisitos indicados acima. (Mas, como é improvável que eu esteja recebendo uma resposta útil, dadas as restrições, ficaria feliz com qualquer sugestão de aplicativo, desde que realmente funcione. Eu sempre posso olhar para um AutoIT / Script AHK ou algo posterior para automatizá-lo.)

  • Entendo que uma imagem final de tamanho incomum pode causar problemas, por isso estou totalmente preparado para aceitar qualquer solução, mesmo que isso resulte em pixels de preenchimento em branco (preferencialmente pretos) à direita / parte inferior. O que eu quero dizer é que eu não me importo se I1 + I2 for 49 6 x256px (preenchimento de 1px) ou até 512x256px (preenchimento de 17px) em tamanho, contanto que a imagem final contenha todos os dados de imagem reais de ambas as imagens de origem, e todo o processo seja sem perdas. Obviamente, quanto menor for o preenchimento (se houver), melhor, mas neste momento, qualquer solução qualquer funcionará.

  • Uma solução baseada no Windows seria perfeita, mas uma baseada no Linux seria totalmente aceitável (binários pré-compilados sem dependências externas, se possível, em vez de apenas trechos de código). Além disso, freeware por favor, a menos que nada, mas o software pago vai fazer o truque.

por Karan 13.09.2012 / 04:54

1 resposta

4

O JpegTran agora foi atualizado por seu desenvolvedor e o bug de truncamento de borda foi corrigido, então nenhum outro aplicativo é necessário para realizar minha tarefa.

    
por 10.10.2012 / 14:06