Redes de fornecimento de conteúdo de imagem

Talvez você já conheça o conceito central da rede de fornecimento de conteúdo (CDN, na sigla em inglês): uma rede de servidores distribuídos, mas interconectados, que entregam recursos aos usuários de maneira rápida e eficiente. Quando é feito o upload de um arquivo em um provedor de CDN, uma cópia é criada nos outros nós da rede CDN em todo o mundo. Quando um usuário solicita um arquivo, os dados são enviados pelo nó geograficamente mais próximos desse usuário, reduzindo a latência. A natureza distribuída das CDNs também fornece redundância no caso de interrupções da rede ou falha do hardware, além de balanceamento de carga para mitigar picos no tráfego.

Uma CDN de imagem pode oferecer todos esses benefícios, com uma diferença principal: a capacidade de transformar e otimizar o conteúdo de uma imagem com base nas strings que o URL usou para acessá-la.

Um usuário vai fazer upload de uma imagem canônica de alta resolução para o provedor, que vai gerar um URL usado para acessá-la:

https://res.cloudinary.com/demo/image/upload/sample.jpg

Embora a sintaxe exata usada varie de um provedor para outro, no mínimo todas as CDNs de imagem permitem alterar as dimensões, a codificação e as configurações de compactação de uma imagem de origem. O Cloudinary, por exemplo, executa o redimensionamento dinâmico de uma imagem enviada usando as seguintes sintaxes: h_ seguido pela altura numérica em pixels, w_ seguido pela largura e um valor c_ que permite especificar informações detalhadas sobre como a imagem precisa ser dimensionada ou cortada.

Qualquer número de transformações pode ser aplicado adicionando valores separados por vírgula ao URL, antes do nome do arquivo e da extensão. Isso significa que a imagem enviada pode ser manipulada conforme necessário por meio do src do elemento img que a solicita.

<img src="https://res.cloudinary.com/demo/image/upload/w_400/sample.jpg" alt="…">

Na primeira vez que um usuário acessar o URL que contém essas transformações, uma nova versão da imagem dimensionada proporcionalmente para uma largura de 400 px (w_400) será gerada e enviada. Esse arquivo recém-criado é armazenado em cache no CDN para ser enviado a qualquer usuário que solicite o mesmo URL, em vez de ser recriado sob demanda.

Embora não seja incomum que os provedores de CDN de imagens ofereçam kits de desenvolvimento de software para facilitar o uso avançado e a integração com várias pilhas de tecnologia, esse padrão de URL previsível por si só permite transformar facilmente um único arquivo enviado em um atributo srcset viável sem a necessidade de outras ferramentas de desenvolvimento:

<img
  src="https://res.cloudinary.com/demo/image/upload/w_1000/sample.jpg 1000w"
  srcset="https://res.cloudinary.com/demo/image/upload/w_1000/sample.jpg 1000w,
        https://res.cloudinary.com/demo/image/upload/w_800/sample.jpg 800w,
        https://res.cloudinary.com/demo/image/upload/w_600/sample.jpg 600w"
  alt="…">

Podemos especificar manualmente o nível de compactação que queremos usando o que agora deveria ser uma sintaxe conhecida: q_, abreviação de "qualidade", seguida pela abreviação numérica para nível de compactação:

<img src="https://res.cloudinary.com/demo/image/upload/w_400,q_60/sample.jpg"  alt="…">

No entanto, é raro você precisar incluir essas informações manualmente, graças a um conjunto de recursos extremamente eficientes fornecidos pela maioria das CDNs de imagem: compactação, codificação e negociação de conteúdo totalmente automáticas.

Compactação automatizada

O poder de computação de imagens que os CDNs têm à disposição significa que eles podem oferecer um recurso incrivelmente eficiente: analisar o conteúdo de uma imagem para determinar com base em algoritmos o nível de compactação ideal e as configurações de codificação, da mesma forma que você ajusta manualmente a compactação de cada uma das nossas imagens.

Esses algoritmos automatizam as decisões que você pode tomar para equilibrar o tamanho do arquivo e a qualidade perceptiva, analisando o conteúdo da imagem em busca de sinais mensuráveis de degradação e ajustando as configurações de compactação de acordo com isso. Com frequência, isso significa grandes reduções no tamanho do arquivo em comparação com a abordagem manual única para configurações de compactação.

Por mais complexo que possa parecer esse processo, a implementação não poderia ser muito mais simples: para a Cloudinary, adicionar q_auto a um URL de imagem ativa este recurso:

<img src="https://res.cloudinary.com/demo/image/upload/w_1400/sample.jpg" alt="…">
<!-- 250 KB-->

<img src="https://res.cloudinary.com/demo/image/upload/w_1400,q_auto/sample.jpg" alt="…">
<!-- 134 KB-->

Codificação automatizada e negociação de conteúdo

Ao receber uma solicitação de imagem, as CDNs de imagens determinam a codificação mais moderna compatível com o navegador por meio dos cabeçalhos HTTP enviados pelo navegador junto com as solicitações de recursos, especificamente o cabeçalho Accept. Esse cabeçalho indica as codificações que o navegador consegue entender, usando os mesmos tipos de mídia que usaríamos para preencher o atributo type do <source> de um elemento <picture>.

Por exemplo, adicionar o parâmetro f_auto à lista de transformações de imagem em um URL de recurso instrui explicitamente o Cloudinary a fornecer a codificação mais eficiente que o navegador conseguir entender:

<img src="https://res.cloudinary.com/demo/image/upload/w_1200,q_auto,f_auto/sample.jpg" alt="…">

Em seguida, o servidor gera uma versão da imagem com essa codificação e armazena em cache o resultado para todos os usuários subsequentes com o mesmo nível de suporte ao navegador. Essa resposta inclui um cabeçalho Content-Type para informar explicitamente ao navegador sobre a codificação do arquivo, independentemente da extensão do arquivo. Mesmo que um usuário com um navegador moderno faça uma solicitação de um arquivo com final .jpg, essa solicitação será acompanhada por um cabeçalho informando ao servidor que o AVIF é compatível. O servidor vai enviar um arquivo codificado em AVIF com uma instrução explícita para tratá-lo como AVIF.

Interface do usuário da CDN.

O resultado final é um processo que não apenas evita a criação de arquivos codificados alternadamente e de ajustar manualmente suas configurações de compactação (ou manter um sistema que faz essas tarefas para você), mas também elimina a necessidade de usar <picture> e o atributo type para entregar esses arquivos aos usuários com eficiência. Portanto, usar somente as sintaxes srcset e sizes ainda pode fornecer aos usuários imagens codificadas como, por exemplo, AVIF, voltando ao WebP (ou JPEG-2000, somente para o Safari), voltando à codificação legada mais adequada.

As desvantagens de usar uma CDN de imagem são mais logísticas do que técnicas, sendo o custo a principal entre elas. Embora seja comum que CDNs de imagens ofereçam planos sem custo financeiro de recursos robustos para uso pessoal, a geração de recursos de imagem requer largura de banda e espaço de armazenamento para uploads, processamento no servidor para transformar imagens e mais espaço para os resultados de transformação em cache. Portanto, o uso avançado e os aplicativos de alto tráfego podem exigir um plano pago.