Uma foto de produto com fundo bagunçado pode ser corrigida manualmente. Mil fotos, não. O problema deixa de ser edição e vira consistência: o produto precisa continuar igual, enquanto fundo, luz, enquadramento e atmosfera passam a obedecer à mesma regra visual.

Vamos construir um fluxo para isso. Primeiro, uma edição mínima com uma única imagem. Depois, um script em Node.js que percorre uma pasta, envia cada foto para a API da HiNow e salva as imagens resultantes. O resultado final será uma pasta de catálogo padronizado, mas com uma condição importante: a revisão humana continua no circuito.

A primeira imagem decide o resto

Fotografia macro de uma esfera sendo transformada de uma textura caotica para uma superficie lisa e bem iluminada
O teste inicial revela se o modelo entende a restricao antes de escalar

A edição de imagem usa a mesma rota da geração. A diferença está no campo images, que aponta para a foto original. O modelo HiMegia aceita transformação de imagem existente pela rota POST https://api.hinow.ai/v1/images.

Crie um arquivo chamado edit-one.mjs:

const imageUrl = process.argv[2];

if (!imageUrl) {
  throw new Error("Usage: node edit-one.mjs IMAGE_URL");
}

const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 120000);

try {
  const response = await fetch("https://api.hinow.ai/v1/images", {
    method: "POST",
    headers: {
      Authorization: "Bearer " + process.env.HINOW_API_KEY,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      model: "hinow/himegia",
      prompt: "Preserve exactly the product, including its shape, proportions, colors, labels, text, materials, seams and visible details. Replace only the background with a light neutral studio background. Use soft studio lighting and a discreet natural shadow. Keep the product centered and fully visible.",
      images: [imageUrl],
      parameters: {
        aspect_ratio: "1:1",
        output_format: "jpeg"
      }
    }),
    signal: controller.signal
  });

  if (!response.ok) {
    throw new Error(await response.text());
  }

  const data = await response.json();
  console.log(data.data.urls[0]);
} finally {
  clearTimeout(timeout);
}

Execute com uma URL pública:

HINOW_API_KEY="sua-chave" node edit-one.mjs "https://exemplo.com/produto.jpg"

A resposta contém a imagem editada em data.data.urls[0]. A URL da imagem original precisa estar acessível pela internet. Um arquivo apenas no seu computador não basta para essa chamada.

O prompt tem uma estrutura deliberada. Primeiro vem o que deve ser preservado. Depois, o que pode mudar. Essa ordem reduz uma ambiguidade perigosa: “melhore a foto” autoriza o modelo a reinterpretar o próprio produto. Para um catálogo, isso pode alterar uma etiqueta, uma cor ou o formato de uma peça.

A geração leva de segundos a mais de meio minuto por imagem, por isso o timeout é de 120 segundos. A primeira etapa serve para ajustar o texto antes de multiplicar o erro.

O prompt precisa separar identidade de cenário

Uma boa instrução de edição descreve duas camadas. A identidade é tudo que torna o produto reconhecível: geometria, texto, logotipo, textura, cor e proporção. O cenário é o que pode ser substituído: fundo, luz, sombra e atmosfera.

Compare estas duas instruções:

Coloque o produto em um fundo bonito e profissional.
Preserve exatamente o produto, suas proporções, cores, textos, materiais e detalhes visíveis. Troque apenas o fundo por um cenário neutro claro, com luz suave de estúdio, sombra discreta e enquadramento central.

A segunda não garante, por si só, a preservação perfeita; é necessário validar o resultado. Ela transforma uma intenção vaga em restrições que podem ser verificadas na revisão.

Também vale manter o formato fixo quando o destino for um catálogo. No exemplo, 1:1 e jpeg fazem cada saída seguir a mesma convenção. Se as fotos originais tiverem formatos diferentes, o enquadramento quadrado pode cortar partes importantes. Nesse caso, escolha outra proporção aceita, como 4:3 ou 3:4, e teste novamente na imagem única.

Agora transforme o teste em fila

Depois que uma imagem estiver aceitável, processe a pasta. O script abaixo lê uma lista de URLs, cria uma fila de trabalho com concorrência limitada e grava as URLs retornadas em um arquivo de resultados. Como a API recebe URLs, ele pressupõe que você já tenha publicado as imagens originais em um armazenamento acessível.

Salve como batch-edit.mjs:

import { readFile, writeFile } from "node:fs/promises";
import { extname } from "node:path";

const inputFile = process.argv[2];
const outputFile = process.argv[3] || "results.json";
const concurrency = Number(process.argv[4] || 3);

if (!inputFile) {
  throw new Error("Usage: node batch-edit.mjs URLS_FILE OUTPUT_FILE CONCURRENCY");
}

const urls = (await readFile(inputFile, "utf8")).split("\n").map((value) => value.trim()).filter(Boolean);
const results = new Array(urls.length);
let nextIndex = 0;

async function editImage(index, imageUrl) {
  const controller = new AbortController();
  const timeout = setTimeout(() => controller.abort(), 120000);

  try {
    const response = await fetch("https://api.hinow.ai/v1/images", {
      method: "POST",
      headers: {
        Authorization: "Bearer " + process.env.HINOW_API_KEY,
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        model: "hinow/himegia",
        prompt: "Preserve exactly the product, including its shape, proportions, colors, labels, text, materials, seams and visible details. Replace only the background with a light neutral studio background. Use soft studio lighting and a discreet natural shadow. Keep the product centered and fully visible.",
        images: [imageUrl],
        parameters: {
          aspect_ratio: "1:1",
          output_format: "jpeg"
        }
      }),
      signal: controller.signal
    });

    if (!response.ok) {
      throw new Error(await response.text());
    }

    const data = await response.json();
    results[index] = {
      source: imageUrl,
      output: data.data.urls[0],
      status: "ok"
    };
    console.log(`Completed ${index + 1}/${urls.length}`);
  } catch (error) {
    results[index] = {
      source: imageUrl,
      status: "error",
      error: error.message
    };
    console.error(`Failed ${index + 1}/${urls.length}: ${error.message}`);
  } finally {
    clearTimeout(timeout);
  }
}

async function worker() {
  while (true) {
    const index = nextIndex++;
    if (index >= urls.length) return;
    await editImage(index, urls[index]);
  }
}

await Promise.all(
  Array.from({ length: Math.min(concurrency, urls.length) }, () => worker())
);

await writeFile(outputFile, JSON.stringify(results, null, 2));
console.log(`Saved ${results.length} results to ${outputFile}`);

O arquivo URLS_FILE é uma lista simples, uma URL por linha. A concorrência padrão é 3:

HINOW_API_KEY="sua-chave" node batch-edit.mjs urls.txt results.json 3

A fila evita abrir chamadas demais ao mesmo tempo e permite retomar o trabalho com mais controle. A concorrência não aumenta a qualidade da edição. Ela só muda quantas imagens ficam em processamento simultaneamente.

A conta que impede uma falsa economia

O tempo total depende da duração de cada edição e do limite de concorrência; a execução em paralelo pode reduzir o tempo em relação ao processamento sequencial.

A revisão é outra conta. Se uma pessoa gastar 2 minutos por foto, revisar mil imagens manualmente consome 2.000 minutos, ou cerca de 33 horas. Com amostragem de 10%, a revisão inicial cai para 100 fotos, pouco mais de 3 horas.

Isso não prova que 10% seja uma taxa segura para qualquer catálogo. É uma política operacional que precisa ser ajustada ao risco. Para produtos regulados, caros ou com texto essencial, defina uma amostra maior ou faça revisão integral.

Reprove o lote quando a amostra encontrar defeitos

A validação não deve perguntar apenas se a imagem ficou bonita. Ela deve procurar mudanças proibidas:

  • o formato do produto mudou;
  • uma cor ou textura foi alterada;
  • texto, etiqueta ou número ficou ilegível;
  • uma parte foi cortada;
  • a sombra atravessou o produto;
  • o fundo novo criou objetos que parecem fazer parte da embalagem.

Uma política operacional proposta é revisar 1 em cada 10 imagens e reprovar o lote se mais de uma falhar na amostra. Esse limite é uma escolha de processo, não um resultado científico consolidado. O ponto essencial é não publicar saídas geradas sem inspeção.

Também compare o antes e o depois lado a lado. A consistência visual é útil apenas quando não destrói a fidelidade do item vendido. Uma foto uniforme com um detalhe errado é pior que uma foto imperfeita.

O próximo passo é catalogar as exceções

Depois do primeiro lote, não tente resolver tudo com um prompt gigantesco. Separe os casos que falharam: produtos transparentes, embalagens com texto pequeno, objetos muito escuros e fotos em que o item encosta na borda. Crie instruções específicas para esses grupos e processe cada grupo com sua própria fila.

O mesmo fluxo pode ser adaptado para gerar variações sazonais, trocar o fundo por uma ambientação temática ou preparar versões com diferentes proporções para canais de publicação, desde que essas variações sejam testadas e revisadas.

A automação não transforma uma decisão visual em verdade. Ela transforma uma decisão bem descrita em repetição. É essa diferença que permite editar mil fotos sem fingir que mil fotos deixaram de precisar de julgamento.