Como posso adicionar uma borda a uma foto JPEG sem afetar a qualidade?

24

Eu tenho uma foto no formato JPEG com resolução 4680x3120. Quero adicionar uma borda branca ao redor desta foto, transformando-a em uma foto de 5200 x 3467 (por motivos de impressão).

Claramente, não estou alterando ou removendo nada da foto, estou apenas adicionando algo. Portanto, em princípio, esse procedimento pode ser sem perdas. No entanto, se eu usar o Paint para adicionar essa borda, o processo de economia do Paint comprimirá a foto novamente no formato JPEG, perdendo informações e qualidade.

Existe uma maneira (algum programa mais profissional) de adicionar algo a uma foto JPEG, como uma borda, sem afetar a parte original da foto, sem reduzir sua qualidade?

LBogaardt
fonte

Respostas:

35

Embora a resposta de Philip seja o melhor caminho a seguir, é possível fazer o que você deseja inteiramente na esfera do JPEG.

O JPEG funciona dividindo sua imagem em blocos chamados Unidades Mínimas de Codificação (MCUs), normalmente 16 × 16 cada, e compactando-as separadamente. Você pode ver isso nas imagens quando aumenta muito o nível de compressão. Em níveis de compressão mais razoáveis, os blocos se misturam tão suavemente que você nunca vê as bordas.

Podemos aproveitar esse fato para adicionar, sem perdas, uma borda branca simples a uma imagem. Simplesmente precisamos criar uma matriz oca de blocos brancos igual ao tamanho da imagem de saída e soltar os blocos JPEG MCU originais no meio.¹

Existe uma desvantagem nessa técnica: ela só funciona quando os tamanhos de imagem de entrada e saída são múltiplos múltiplos do tamanho da MCU. Quando esse não é o caso, precisamos recomprimir alguns dos blocos na margem entre a borda branca e as bordas da imagem original. Você não verá essa diferença na saída se ficar longe dos níveis de compactação JPEG excessivamente altos, por isso ainda é efetivamente sem perdas.

Não conheço nenhum programa que faça apenas isso. A coisa mais próxima que eu conheço é algo que faz a operação inversa: o jpegtran possui uma função de corte que corta sem perda partes das bordas da imagem.² Faz isso descartando os MCUs cortados ao longo das bordas da imagem, deixando-os em o meio intocado.

A solução pronta mais simples que conheço é o plugin Better JPEG Lossless Resave para Photoshop. Ele usa técnicas baseadas nas idéias dadas acima para copiar os MCUs da imagem original sempre que possível, para evitar recriá-los a partir da versão descompactada, como normalmente faz o Photoshop.³


Digressões:

  1. Você pode pensar que a borda resultante não será totalmente branca , pois a perda de JPEG criará algum tipo de diferença de cor na saída. Fiz alguns testes e, no Photoshop, pelo menos, uma imagem puramente branca salva pelo nível 10 do JPEG da Save For Web (isto é, qualidade "baixa") resulta em uma imagem decodificada que ainda é puramente branca.

    Eu determinei isso com dois testes:

    Primeiro, carreguei o JPEG como uma camada em cima do original, defina o modo de mesclagem da camada superior como Diferença e, em seguida, adicionei uma camada de ajuste de Níveis acima para tentar aumentar as diferenças. A imagem resultante permaneceu preta, indicando "sem diferença".

    Segundo, quando não consegui ver as diferenças esperadas, larguei a camada de ajuste e retornei a camada JPEG ao modo de mesclagem Normal, peguei a ferramenta Conta-gotas e procurei por toda a imagem um pixel que não aparecia como RGB (255.255.255 ) no painel Informações. Eu nunca encontrei um. Eu esperava ver os números piscarem um pouco enquanto esfregava a imagem, mas eles permaneceram firmes.

    Só posso concluir que este é um caso degenerado do algoritmo de codificação: blocos brancos puros permanecem brancos através da transformada discreta de cosseno .

    Curiosamente, isso não acontece com blocos pretos puros. Pelo menos com a implementação do Photoshop, eles se transformam em RGB (1,1,1) quando decodificados, e não em RGB (0,0,0).

    Resumindo, você não precisa se preocupar com pontos pontilhados nessa área de borda ao imprimir uma imagem produzida usando a técnica acima.

  2. jpegtrané um programa de linha de comando, mas também há um programa GUI do Windows com base no mesmo código chamado jpegcrop.

  3. Infelizmente, este plugin é apenas para Windows.

Warren Young
fonte
11
Eu usei um programa chamado JPEG Wizard que forneceu essa funcionalidade. Ele também tinha uma capacidade muito boa de aplicar diferentes taxas de compactação em diferentes partes de um JPEG. Assim, pode-se usar uma configuração de alta qualidade para a cabeça e as mãos de uma pessoa, qualidade média para suas roupas e qualidade inferior para o plano de fundo e, assim, acabar com um arquivo menor, mas com melhor qualidade geral do que se alguém tivesse usado qualidade média para tudo.
Supercat
11
Não tive chance de experimentá-lo, mas este post do blog sugere que jpegtrana função de recorte também pode ser usada para estender. (Não tenho certeza de que cor das fronteiras estendidas acabam sendo, no entanto.)
mattdm
4
@mattdm: Sim, jpegtrantambém pode estender a imagem, mas ela sempre funciona com um cinza médio do código embutido, RGB (128,128,128). Isso é feito simplesmente porque é a única opção fácil, já que no espaço do coeficiente do DCT, você pode fazer isso com uma bzero()chamada simples . Tentei um truque selvagem para mudar isso , o que não funciona, mas deveria lhe dar uma sensação da feiura envolvida. joga as mãos para cima em frustração
Warren Young
@ WarrenYoung: Para alterar a cor dos blocos de preenchimento, você presumivelmente precisará alterar apenas o primeiro coeficiente (DC) e deixar os outros em zero. Claro, os coeficientes são compactados, então ... de qualquer maneira, deve ser factível, mas concordo que não é tão trivial quanto pode parecer.
Ilmari Karonen 16/03/2015
2
Quanto ao seu último ponto - a maior quantidade de economia advém do descarte de informações de alta frequência. O ganho de jogar fora a precisão na cor de um bloco sólido de pixels não pode ser superior a um byte ou dois, portanto nunca ou quase nunca é feito. Se houver alguma perda de informações, está na conversão do espaço de cores YUV <-> RGB.
Hbbs
20

O ponto a lembrar aqui é que você perde qualidade ao salvar a foto em um formato de compactação com perda. Desde que você salve a foto em um formato sem perdas (PSD, TIFF etc.) após adicionar a borda, você não perderá mais dados do que já perdeu ao salvar a foto como JPEG em primeiro lugar.

Philip Kendall
fonte
11
Obrigado. E isso é verdade mesmo quando se usa um programa 'ruim' como o Paint, quando o salva em, por exemplo, TIFF?
LBogaardt # 16/15
4
Pelo menos de acordo com o meu teste rápido, o Paint usa o algoritmo de compactação LZW sem perdas ao salvar TIFFs, para que pareça OK.
Philip Kendall
5
Tenha em mente que este é susceptível de aumentar significativamente o tamanho da imagem ...
BlueRaja - Danny Pflughoeft
2
pintar também suporta PNG, que também é um formato lossless
phuclv
+1 para isso, pois as respostas que discutem salvar novamente em jpeg não são compatíveis com todas as opções de codificação de jpeg.
James Snell
6

Não é totalmente sem perdas, mas você pode se aproximar bastante usando o GIMP (ou algum outro editor com um recurso semelhante) e os dois truques a seguir:

  1. Primeiro, verifique se a borda que você está adicionando tem um múltiplo de 8 pixels de largura (e de preferência um múltiplo de 16 pixels).

    Isso é importante porque o algoritmo de compactação JPEG divide a imagem em blocos de 8 × 8 pixels *, iniciando no canto superior esquerdo, e aplica o algoritmo de compactação com perdas independentemente a cada bloco. Assim, pelo menos em princípio, você pode preencher uma imagem JPEG sem perdas adicionando blocos completos de 8 × 8 pixels em torno dos já existentes. Se, no entanto, você tentasse adicionar uma borda que não tivesse um número inteiro de blocos, os blocos na imagem preenchida não seriam alinhados com os do original, e alguma perda de compactação seria inevitável.

    *) Na verdade, a maioria das imagens JPEG usa subamostragem de croma , o que significa que apenas a parte da escala de cinza da imagem é realmente compactada em blocos 8 × 8, enquanto os canais de croma são reduzidos em 50% antes da compactação, tornando seu tamanho efetivo do bloco 16 × 16 pixels. Assim, para obter melhores resultados, a largura da borda deve ser realmente um múltiplo de 16 pixels. No entanto, geralmente você pode se dar bem com uma borda de 8 (ou 24 ou 40 etc.) pixels, pois um pouco de perda de compressão no chroma não é muito perceptível.

  2. A segunda parte do truque é, ao salvar a imagem final, marcar a caixa de seleção "Usar configurações de qualidade da imagem original" na caixa de diálogo Exportar imagem como JPEG (em Configurações avançadas). Faça isso mesmo que pareça resultar em uma qualidade mais baixa do que você normalmente usaria!

    Essa configuração faz com que o GIMP reutilize exatamente as mesmas configurações de compactação usadas para a imagem original, o que geralmente elimina cerca de 99% das perdas de compactação, desde que você não tenha editado a imagem muito intensamente e, em particular, que os blocos no a nova imagem ainda está alinhada com as do original. (Ocasionalmente ainda haverá algumas perdas devido a erros de arredondamento, mas muito menos do que seria o contrário).


Como uma demonstração rápida, tirei esta imagem de teste JPEG do Wikimedia Commons , originalmente salva com uma configuração de qualidade bastante baixa de 50 e adicionei uma (e meio) borda preta e branca sofisticada (tipo de) 8px usando o método descrito acima:

Teste de imagem com borda de 8px, principalmente sem perdas

Aqui está a diferença entre a imagem original (15,1 kB) e a imagem editada (16,7 kB), mostrada usando o modo de camada "Grain extract" do GIMP:

Diferença entre imagem acolchoada e original

Você pode ver alguns erros de croma muito leves, causados ​​pelo fato de a largura da borda não ser um múltiplo de 16 e (se você olhar com atenção) alguns blocos onde também houve pequenas perdas no canal luma devido ao arredondamento. Ainda assim, visualmente, a imagem original e a imagem acolchoada são praticamente indistinguíveis, mesmo com ampliação de 2x e alternando entre elas.

Em particular, compare isso com o resultado de aumentar a qualidade JPEG de 50 para 60 antes de salvar a imagem acolchoada, que produz a seguinte imagem de 17,6 kB:

Teste de imagem com margem de 8 px, qualidade aumentada de 50 para 60

Em alta ampliação, você pode definitivamente ver que a imagem editada é visivelmente mais borrada em alguns lugares do que a original, e a diferença com o extrato de grão confirma isso:

Diferença entre imagem acolchoada (no q60) e original

Ilmari Karonen
fonte
"marcar esta caixa de seleção parece não afetar a configuração" Progressivo "." Não é um bug, pois a codificação progressiva é uma configuração de codificação, não uma configuração de qualidade. O Jpegtran pode converter imagens para e de progressivas sem perdas.
Damian Yerrick
@ maçãs: Você está certo; Eu removi esse parágrafo. Por alguma razão, tive a impressão de que alternar o modo progressivo faria com que as configurações de qualidade não correspondessem, mas um teste rápido parece confirmar que eu estava errado sobre isso.
Ilmari Karonen 17/03/2015
11
@thomasrutter: Eu não posso deixar de votar em um comentário, por isso vou apenas apontar para a postagem original do fórum que descreve o recurso e, em particular, esta citação: " Se você fez apenas algumas alterações na imagem, usar as mesmas tabelas de quantização fornecerá quase a mesma qualidade e tamanho de arquivo da imagem original. Isso minimizará as perdas causadas pela etapa de quantização, em comparação com o que aconteceria se você usasse tabelas de quantização diferentes. "
Ilmari Karonen,
11
Apenas para comparação, aqui está outro exemplo em uma resposta a uma pergunta diferente. Meu entendimento em teoria concorda com Ilmari, mas pelo menos no meu exemplo, a prática parece muito mais com o que Thomas diz - pelo menos ao começar com uma imagem altamente degradada. (Eu acho que a lápide faz um mau exemplo para este fim, porque a perda de detalhe sobre a pedra são menos óbvios do que são na pele humana.)
mattdm
11
@mattdm: Parece ser bastante dependente de software; Tentei reproduzir seus resultados dessa resposta no GIMP, e parece que o GIMP (v2.8.10, pelo menos) é um pouco melhor em preservar a qualidade JPEG do que o ImageMagick (qualquer versão que você testou). Sua primeira imagem, salva uma vez na q75, tem um PSNR de 34.0298, enquanto a que foi salva duas vezes na q75 tem uma de apenas 32.8169 (e a que foi salva novamente 8 vezes tem um PSNR de 32.6459). Em comparação, salvar a mesma imagem de origem uma vez no GIMP em q75 fornece um PSNR de 36,4560; abri-lo e salvá-lo novamente com a mesma qualidade diminui levemente, para 36.3295.
Ilmari Karonen 19/03/2015
3

Desculpe se isso não é exatamente o que você queria, mas ...

Parece que você adiciona uma borda branca como uma ajuda para posicionar sua imagem durante a impressão. Por que não se concentrar em aprender as interfaces de impressão corretamente e evitar hackers desonestos como este? A outra questão levantada é: você está permitindo que o programa de impressão redimensione sua imagem de 4680x3120 para se ajustar à DPI / resolução correta. Isso pode ter um efeito mais grave do que salvar novamente um jpeg.

aaaaargZombies
fonte
Ambos os pontos válidos, obrigado. No entanto, enviei minha foto para uma dessas lojas de impressão on-line, para não ter controle sobre a impressora real.
LBogaardt 23/03
1

As respostas anteriores são muito boas.

Vou apenas adicionar alguns "aspectos psicológicos" do formato jpg.

Se um jpg estiver bem preparado, ele perde apenas cerca de 0,5% de informações. Na maioria dos casos, isso é algo que o olho humano não pode ver. Você precisa de um programa para fazer algumas análises e ver as diferenças (como a análise que Ilmari acabou de fazer).

"Boa qualidade" é um processo, não apenas a maneira como um formato de arquivo salva a imagem. Sim, você recompôs o arquivo com jpg mais uma vez porque realmente precisava dele. Se estiver em uma situação controlada, não há problema em fazer isso.

Você realmente precisava, pois isso implica que você não pode usar outro formato sem perdas, que possui necessidades muito específicas de armazenamento ou software ou um fluxo de trabalho muito restrito.

Se você está realmente preocupado com a qualidade, provavelmente não usaria o Paint. O formato JPG possui algumas configurações que você não pode controlar no Paint.

Aqui está minha lista de programas gratuitos, onde você realmente pode controlar a compactação de jpg e a opção que precisa selecionar. (Todos eles na caixa de diálogo salvar jpg)

Irfanview - Ative Desativar subamostragem de cores croma.

FastStone Image Viewer - Subamostragem de cores: Nenhuma.

Gimp - Subamostragem 4: 4: 4

Conclusão. Não use o Paint.

Uma coisa que eu ainda não verifiquei. Se todos esses programas mantiverem o perfil de cores incorporado. Vou editar minha postagem mais tarde.

Rafael
fonte
Alguém votou -1 nesta resposta. Normalmente eu não me importo porque sei que posso dizer algo idiota. Nesse caso específico, que parte da resposta está errada?
Rafael
Não votei (para cima ou para baixo), mas você pode querer trabalhar com a ortografia e a gramática para dar uma melhor primeira impressão (e também, honestamente, para facilitar a leitura da resposta). Além disso, essa pergunta já tem várias respostas (e a minha, especialmente, ficou bastante longa); em algum momento, algumas pessoas podem começar a votar de forma negativa (ou pelo menos não votar) respostas que não adicionam claramente algo novo às existentes. Além disso, tente estruturar sua resposta para que os bits importantes se destaquem rapidamente; Nesse caso, a única parte destacada em negrito é uma nota de rodapé sem importância.
Ilmari Karonen 21/03
Obrigado pelo seu comentário Ilmari. Estou lutando para pensar em inglês, pois não é minha língua nativa. Vou procurar uma ferramenta de ortografia. Não tenho certeza se existe uma gramática. - Para a segunda parte do comentário, entendo que a lógica por trás do StackExchange é responder a pergunta de forma independente, porque o fluxo das respostas não é fixo, porque elas podem mudar de ordem ou serem editadas. Vou dar uma olhada nisso. (Removi o texto em negrito) Obrigado novamente. : o)
Rafael
11
"ele perde apenas cerca de informação 0,5%" [carece de fontes?] :)
Warren Young
Olá Warren, aqui está: otake.com.mx/Apuntes/PruebasDeCompresion2/… Está em espanhol, por favor use o google translate por enquanto e preciso atualizá-lo. Na verdade, é menos de 0,392% :)
Rafael
0

O IrfanView funciona bem para mim em conjuntos de imagens. Aqui estão algumas notas de instruções

Aqui está o meu procedimento armazenado para inserção de borda - Procedimento de infra-estrutura para adicionar uma borda

  1. Imagem com o botão direito, 'Abrir com' -> 'InfranView'
  2. Pressione 'b'
  3. Marque 'Usar opções avançadas' no canto superior esquerdo, pressione 'Avançado'
  4. Marque 'Tamanho da tela', pressione 'Configurações'
  5. Digite a largura de cada borda (lado esquerdo, lado direito, lado superior, lado inferior)
  6. Pressione OK'
  7. Selecione 'Substituir arquivos existentes'
  8. Pressione OK'
  9. Digite o diretório de saída 'Diretório de saída dos arquivos de resultado:'
  10. Navegue até e clique duas vezes na imagem à qual adicionar borda na lista superior. Isso o adiciona à lista 'arquivos de entrada:' na lista inferior
  11. Pressione 'Iniciar lote'
J-Dizzle
fonte
11
Você poderia explicar o que é especial sobre esse método para que ele atenda aos requisitos do pôster de não diminuir a qualidade da imagem? Na primeira leitura, isso parece enviar o JPEG ao longo de todo o ciclo de descompressão-recompressão que o pôster está tentando evitar.
Philip Kendall
hmmm, você traz um ponto interessante com relação ao ciclo de vida da imagem através do processo que listo aqui, não pensei nisso. Você pode estar certo, se você gostaria que eu removesse ou emenda minha postagem, por favor me avise :)!
precisa saber é o seguinte