# Entrega de imagens

Uma imagem construída sob demanda ainda precisa chegar ao browser em um formato que ele lê, e ser construída uma vez, e não para cada leitor. Em uma aplicação, Image Processor constrói uma imagem derivada a partir da imagem de origem que está no servidor de origem. Como uma requisição se torna uma imagem derivada, com o diagrama dessa cadeia, está em [Como Applications funciona](/pt-br/documentacao/plataforma/applications/como-funciona/#image-processor).

As seções cobrem como o formato entregue é escolhido, como o cache diferencia uma imagem derivada de outra e onde Image Processor para.

---

## Negociação de formato

O formato entregue nem sempre é o formato da imagem de origem. Dois mecanismos o alteram, e eles se comportam de forma diferente.

O primeiro é explícito. Um filtro `filters:format()` na string `ims` pede um formato de saída nomeado. Converter para WEBP também exige que a requisição carregue `Accept: image/webp`, e o behavior [Add Request Header](/pt-br/documentacao/plataforma/applications/rules-engine/#add-request-header) adiciona esse header quando o browser não o envia.

O segundo é automático e não precisa de nenhum parâmetro `ims`. Image Processor detecta se o browser aceita WEBP e converte a imagem quando aceita. Uma imagem BMP é convertida para JPEG ou WEBP dependendo do mesmo suporte. Por exemplo, uma requisição cujo header `Accept` lista `image/webp`, sem query string, pode receber `image/webp` para uma imagem de origem armazenada como PNG.

Os bytes na origem e os bytes transmitidos são, portanto, duas medidas diferentes, e a resposta informa isso. Uma resposta processada carrega `x-ims: Enabled`, e `x-original-image-size` carrega o tamanho da imagem de origem antes da transformação. Um leitor que nunca escreve um filtro ainda pode receber um formato diferente do que está na origem. Leia esses headers antes de comparar uma resposta com o arquivo na origem. Para os headers, consulte [Configurações do Image Processor](/pt-br/documentacao/plataforma/applications/image-processor/configuracoes/#headers-de-resposta).

---

## Uma entrada de cache por transformação

Uma imagem derivada só vale a pena ser construída uma vez. A prática para o cache setting que serve imagens é listar `ims` no seu controle de query string: **Cache vary by Query String**, com o **Behavior** *Allowlist* e `ims` em **Fields**. Cada string `ims` distinta tem então uma cache key própria. Esse controle pertence à seção **Application Accelerator** de um cache setting, `cache_vary_by_querystring` em `modules.application_accelerator`. Variar o cache por `ims` exige, portanto, Application Accelerator, enquanto processar uma imagem não exige.

Um cache setting criado com essa allowlist é lido de volta com este objeto `modules`:

```json
{
  "modules": {
    "application_accelerator": {
      "cache_vary_by_querystring": {
        "behavior": "allowlist",
        "fields": ["ims"],
        "sort_enabled": false
      },
      "cache_vary_by_cookies": { "behavior": "ignore", "cookie_names": [] },
      "cache_vary_by_devices": { "behavior": "ignore", "device_group": [] },
      "cache_vary_by_method": []
    },
    "cache": {
      "behavior": "honor",
      "max_age": 60,
      "stale_cache": { "enabled": false },
      "large_file_cache": { "enabled": false, "offset": 1024 },
      "tiered_cache": { "enabled": false }
    }
  }
}
```

Uma imagem derivada convertida para outro formato também carrega o formato depois do separador `@@`, como em `httpsstatic.example.com/static/images/image_1.jpg?ims=880x@@webp`.

Essa key tem um custo, e o custo é a cardinalidade. Cada string `ims` distinta é um objeto armazenado distinto. Uma página que pede larguras arbitrárias armazena um objeto por largura, enquanto uma página que pede quatro larguras fixas armazena quatro. Escolher um conjunto pequeno de tamanhos é, portanto, tanto uma decisão de cache quanto uma decisão de layout.

Também é uma decisão de cobrança. Uma imagem servida a partir do cache sem processamento não conta para o medidor mensal de Images, então uma imagem derivada bem armazenada em cache custa uma imagem processada, não importa quantos leitores a recebam. Para o que cada plano inclui, consulte [Limites de Applications](/pt-br/documentacao/plataforma/applications/limites/#image-processor).

---

## Onde Image Processor para

Image Processor lê uma imagem de origem e retorna uma derivada. Ele não armazena imagens e não aceita uploads: a imagem de origem permanece onde já está, e nenhuma imagem derivada se torna um ativo da conta. Um workflow que precisa manter um arquivo transformado precisa salvar a resposta por conta própria.

O que a string `ims` pode expressar e o tamanho da imagem limitam a transformação. As operações que a string aceita estão em [Parâmetros de URL do Image Processor](/pt-br/documentacao/plataforma/applications/image-processor/parametros-de-url/), e o tamanho e as dimensões máximas estão em [Limites de Applications](/pt-br/documentacao/plataforma/applications/limites/#image-processor).

Um limite merece ser nomeado, porque duas superfícies compartilham um nome. **WASM Image Processor** é uma biblioteca WebAssembly que processa imagens dentro de uma função em [Functions](/pt-br/documentacao/plataforma/functions/). É uma superfície diferente, com uma interface diferente, e nada nesta página a configura.

---

## Recursos relacionados

- [Configurações do Image Processor](/pt-br/documentacao/plataforma/applications/image-processor/configuracoes.md): Os headers e os behaviors de Image Processor, incluindo os headers de resposta de uma imagem processada.
- [Parâmetros de URL do Image Processor](/pt-br/documentacao/plataforma/applications/image-processor/parametros-de-url.md): Cada operação que a query string ims expressa, com os valores que cada uma aceita.
- [Configure Image Processor em uma aplicação](/pt-br/documentacao/guias/performance-e-confiabilidade/otimizacao-de-entrega/processar-imagens.md): A regra que envia requisições de imagens ao Image Processor, passo a passo.
- [Configurações do Application Accelerator](/pt-br/documentacao/plataforma/applications/application-accelerator/configuracoes.md): O controle de query string que dá a cada string ims uma cache key própria.
