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

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.




