gerar_ia.php — leitura técnica completa

sistema/painel/paginas/simulador/gerar_ia.php
Endpoint que usa OpenAI para gerar uma imagem simulada da prótese a partir da foto original.

SimuladorEndpoint IA / geração de imagem272 linhas

Responsabilidade do arquivo

Endpoint que usa OpenAI para gerar uma imagem simulada da prótese a partir da foto original.

Dependências observadas:
Conexão PDO / configurações globaisOpenAIBanco de dados

Tipo

Endpoint IA / geração de imagem

Grupo

Simulador

Total de linhas

272

Código completo

1<?php 2require_once("../../../conexao.php"); 3 4$tabela = 'simulacoes_protese'; 5 6$id = @$_POST['id']; 7 8if($id == ""){ 9 echo 'ID da simulação não informado'; 10 exit(); 11} 12 13$query = $pdo->query("SELECT s.*, c.nome as nome_cliente, p.modelo, p.cor, p.densidade, p.tamanho 14 FROM $tabela s 15 INNER JOIN clientes c ON s.cliente = c.id 16 INNER JOIN proteses p ON s.id_protese = p.id 17 WHERE s.id = '$id'"); 18$res = $query->fetchAll(PDO::FETCH_ASSOC); 19 20if(@count($res) == 0){ 21 echo 'Registro não encontrado'; 22 exit(); 23} 24 25$modelo = trim(@$res[0]['modelo']); 26$cor = trim(@$res[0]['cor']); 27$densidade = trim(@$res[0]['densidade']); 28$tamanho = trim(@$res[0]['tamanho']); 29$observacoes = trim(@$res[0]['observacoes']); 30$foto_original = trim(@$res[0]['foto_original']); 31 32$query2 = $pdo->query("SELECT * FROM config LIMIT 1"); 33$res2 = $query2->fetchAll(PDO::FETCH_ASSOC); 34 35if(@count($res2) == 0){ 36 echo 'Configurações não encontradas'; 37 exit(); 38} 39 40$openai_key = trim(@$res2[0]['openai_key']); 41 42if($openai_key == ""){ 43 echo 'OpenAI Key não cadastrada'; 44 exit(); 45} 46 47if($foto_original == ""){ 48 echo 'Nenhuma foto original enviada'; 49 exit(); 50} 51 52$pasta_upload = __DIR__ . '/../../images/simulacoes/'; 53 54if(!is_dir($pasta_upload)){ 55 echo 'Pasta de imagens da simulação não encontrada'; 56 exit(); 57} 58 59if(!is_readable($pasta_upload)){ 60 echo 'Pasta de imagens da simulação sem permissão de leitura'; 61 exit(); 62} 63 64if(!is_writable($pasta_upload)){ 65 echo 'Pasta de imagens da simulação sem permissão de escrita'; 66 exit(); 67} 68 69$caminho_foto = $pasta_upload . $foto_original; 70 71if(!file_exists($caminho_foto)){ 72 echo 'Arquivo da foto original não encontrado'; 73 exit(); 74} 75 76if(!is_file($caminho_foto)){ 77 echo 'Arquivo da foto original inválido'; 78 exit(); 79} 80 81if(!is_readable($caminho_foto)){ 82 echo 'Arquivo da foto original sem permissão de leitura'; 83 exit(); 84} 85 86$extensao = strtolower(pathinfo($caminho_foto, PATHINFO_EXTENSION)); 87$mime = 'image/jpeg'; 88 89if($extensao == 'png'){ 90 $mime = 'image/png'; 91} 92 93if($extensao == 'webp'){ 94 $mime = 'image/webp'; 95} 96 97$arquivo_curl = new CURLFile($caminho_foto, $mime, basename($caminho_foto)); 98 99/* 100 Prompt travado do simulador 101 Seguir exatamente o que o profissional definiu 102*/ 103$prompt = "Edite a imagem enviada criando uma simulacao fotografica profissional de protese capilar. "; 104$prompt .= "Mantenha obrigatoriamente o mesmo rosto, expressao, angulo, proporcao da cabeca, fundo e enquadramento da foto original. "; 105$prompt .= "Nao alterar identidade da pessoa. Nao alterar sobrancelhas. Nao alterar barba. Nao alterar roupa. Nao alterar iluminacao de forma artificial. "; 106$prompt .= "A simulacao deve parecer resultado real de aplicacao profissional em clinica ou barbearia especializada. "; 107 108$prompt .= "REGRA PRINCIPAL OBRIGATORIA: a simulacao deve seguir exatamente o que o profissional definiu no sistema. "; 109$prompt .= "Nao inventar outra cor. Nao inventar outra densidade. Nao inventar outro modelo. Nao suavizar grisalho. Nao reduzir percentual de branco. Nao aumentar percentual de branco. "; 110 111$prompt .= "Sugestao de protese definida pelo profissional: " . $modelo . ". "; 112$prompt .= "Cor detectada definida pelo profissional: " . $cor . ". "; 113$prompt .= "Densidade definida pelo profissional: " . $densidade . ". "; 114$prompt .= "Tamanho informado: " . $tamanho . ". "; 115$prompt .= "Observacoes do profissional: " . $observacoes . ". "; 116 117$prompt .= "Modelos permitidos no sistema: Micropele 0.04, Micropele 0.06, Micropele 0.08, Micropele 0.10. "; 118$prompt .= "Usar obrigatoriamente e exatamente o modelo definido pelo profissional, sem substituicao. "; 119 120$prompt .= "Escala profissional de cores permitidas com percentual de branco: "; 121$prompt .= "#1B Preto natural. "; 122$prompt .= "#1B10 Preto natural + 10% branco. "; 123$prompt .= "#1B20 Preto natural + 20% branco. "; 124$prompt .= "#1B30 Preto natural + 30% branco. "; 125$prompt .= "#1B40 Preto natural + 40% branco. "; 126$prompt .= "#1B50 Preto natural + 50% branco. "; 127$prompt .= "#1B60 Preto natural + 60% branco. "; 128$prompt .= "#2 Castanho escuro. "; 129$prompt .= "#210 Castanho escuro + 10% branco. "; 130$prompt .= "#220 Castanho escuro + 20% branco. "; 131$prompt .= "#230 Castanho escuro + 30% branco. "; 132$prompt .= "#240 Castanho escuro + 40% branco. "; 133$prompt .= "#250 Castanho escuro + 50% branco. "; 134$prompt .= "#3 Castanho medio. "; 135$prompt .= "#310 Castanho medio + 10% branco. "; 136$prompt .= "#320 Castanho medio + 20% branco. "; 137$prompt .= "#330 Castanho medio + 30% branco. "; 138$prompt .= "#340 Castanho medio + 40% branco. "; 139$prompt .= "#4 Castanho. "; 140$prompt .= "#410 Castanho + 10% branco. "; 141$prompt .= "#420 Castanho + 20% branco. "; 142$prompt .= "#430 Castanho + 30% branco. "; 143$prompt .= "#440 Castanho + 40% branco. "; 144$prompt .= "#5 Castanho claro. "; 145$prompt .= "#6 Loiro escuro. "; 146 147$prompt .= "Se a cor definida pelo profissional tiver percentual de branco, esse percentual deve aparecer visualmente na simulacao. "; 148$prompt .= "Exemplo: se a cor definida for #1B30, a simulacao deve mostrar preto natural com aproximadamente 30% de fios brancos ou grisalhos visiveis. "; 149$prompt .= "Exemplo: se a cor definida for #220, a simulacao deve mostrar castanho escuro com aproximadamente 20% de fios brancos ou grisalhos visiveis. "; 150$prompt .= "Exemplo: se a cor definida for #340, a simulacao deve mostrar castanho medio com aproximadamente 40% de fios brancos ou grisalhos visiveis. "; 151 152$prompt .= "A IA deve respeitar obrigatoriamente o grisalho definido pelo profissional na cor detectada. "; 153$prompt .= "Nao transformar cor grisalha em cor solida. "; 154$prompt .= "Nao remover os fios brancos quando houver percentual de branco definido. "; 155$prompt .= "Nao adicionar fios brancos quando a cor definida nao tiver percentual de branco. "; 156 157$prompt .= "Densidades permitidas no sistema: 80%, 100%, 130%, 150%. "; 158$prompt .= "Usar obrigatoriamente a densidade exatamente como informada pelo profissional, sem alterar volume para mais ou para menos. "; 159 160$prompt .= "Requisitos visuais obrigatorios: "; 161$prompt .= "resultado extremamente natural, realista e profissional. "; 162$prompt .= "Respeitar linha frontal compativel com o caso real. "; 163$prompt .= "Respeitar direcao dos fios, implantacao, volume e cobertura coerentes com o modelo e densidade definidos. "; 164$prompt .= "Cobertura uniforme e acabamento invisivel na base. "; 165$prompt .= "Sem exagero de volume. "; 166$prompt .= "Sem aparencia de peruca. "; 167$prompt .= "Sem brilho plastico. "; 168$prompt .= "Sem bordas aparentes. "; 169$prompt .= "Nao inserir texto, marca dagua, moldura, elementos extras ou fundo novo. "; 170 171$prompt .= "Resumo final obrigatorio: obedecer exatamente a cor detectada, inclusive percentual de branco, obedecer exatamente a densidade, e obedecer exatamente a sugestao de protese definida pelo profissional."; 172 173$dados = array( 174 'model' => 'gpt-image-1', 175 'prompt' => $prompt, 176 'size' => '1024x1536', 177 'quality' => 'medium', 178 'image' => $arquivo_curl 179); 180 181$ch = curl_init(); 182curl_setopt($ch, CURLOPT_URL, "https://api.openai.com/v1/images/edits"); 183curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 184curl_setopt($ch, CURLOPT_POST, true); 185curl_setopt($ch, CURLOPT_HTTPHEADER, array( 186 "Authorization: Bearer " . $openai_key 187)); 188curl_setopt($ch, CURLOPT_POSTFIELDS, $dados); 189 190$resposta = curl_exec($ch); 191$http = curl_getinfo($ch, CURLINFO_HTTP_CODE); 192$erro = curl_error($ch); 193curl_close($ch); 194 195if($erro != ""){ 196 echo 'Erro ao gerar imagem: ' . $erro; 197 exit(); 198} 199 200if($resposta == ""){ 201 echo 'Resposta vazia da IA'; 202 exit(); 203} 204 205$resposta_decodificada = json_decode($resposta, true); 206 207if($http != 200){ 208 $mensagem_erro = 'Erro ao gerar imagem'; 209 210 if(isset($resposta_decodificada['error']['message'])){ 211 $mensagem_erro = $resposta_decodificada['error']['message']; 212 } 213 214 echo $mensagem_erro; 215 exit(); 216} 217 218if(!isset($resposta_decodificada['data'][0]['b64_json'])){ 219 echo 'Resposta da IA inválida'; 220 exit(); 221} 222 223$imagem_base64_saida = $resposta_decodificada['data'][0]['b64_json']; 224 225if($imagem_base64_saida == ""){ 226 echo 'Imagem gerada inválida'; 227 exit(); 228} 229 230$imagem_binaria = base64_decode($imagem_base64_saida); 231 232if($imagem_binaria === false || $imagem_binaria == ""){ 233 echo 'Erro ao decodificar imagem gerada'; 234 exit(); 235} 236 237$nome_img = md5(uniqid()) . '.png'; 238$caminho = $pasta_upload . $nome_img; 239 240$salvou_imagem = file_put_contents($caminho, $imagem_binaria); 241 242if($salvou_imagem === false){ 243 echo 'Erro ao salvar imagem gerada'; 244 exit(); 245} 246 247if(!file_exists($caminho)){ 248 echo 'Arquivo da imagem gerada não foi gravado'; 249 exit(); 250} 251 252$query3 = $pdo->query("SELECT * FROM $tabela WHERE id = '$id'"); 253$res3 = $query3->fetchAll(PDO::FETCH_ASSOC); 254 255if(@count($res3) > 0){ 256 $imagem_antiga = $res3[0]['imagem_simulada']; 257 258 if($imagem_antiga != ""){ 259 $caminho_antigo = $pasta_upload . $imagem_antiga; 260 261 if(file_exists($caminho_antigo)){ 262 @unlink($caminho_antigo); 263 } 264 } 265} 266 267$query4 = $pdo->prepare("UPDATE $tabela SET imagem_simulada = :imagem_simulada WHERE id = '$id'"); 268$query4->bindValue(":imagem_simulada", $nome_img); 269$query4->execute(); 270 271echo 'Salvo com Sucesso'; 272?>

Leitura linha por linha

LinhaCódigoExplicação técnica
1<?phpAbre um bloco PHP. A partir daqui o arquivo passa a executar lógica no servidor.
2require_once("../../../conexao.php");Importa `../../../conexao.php` para disponibilizar conexão, sessão, funções utilitárias ou validações necessárias ao restante do fluxo.
3 Linha em branco usada para separar blocos e melhorar a leitura.
4$tabela = 'simulacoes_protese';Centraliza o nome da tabela `simulacoes_protese` em uma variável, facilitando reaproveitamento do valor nas queries do arquivo.
5 Linha em branco usada para separar blocos e melhorar a leitura.
6$id = @$_POST['id'];Lê dados de entrada vindos da requisição, sessão ou upload e normaliza o valor para uso no restante da rotina.
7 Linha em branco usada para separar blocos e melhorar a leitura.
8if($id == ""){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
9 echo 'ID da simulação não informado';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
10 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
11}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
12 Linha em branco usada para separar blocos e melhorar a leitura.
13$query = $pdo->query("SELECT s.*, c.nome as nome_cliente, p.modelo, p.cor, p.densidade, p.tamanho Executa uma consulta direta no banco. É um ponto que merece atenção extra quando houver dados vindos do usuário.
14 FROM $tabela sLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
15 INNER JOIN clientes c ON s.cliente = c.idLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
16 INNER JOIN proteses p ON s.id_protese = p.idLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
17 WHERE s.id = '$id'");Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
18$res = $query->fetchAll(PDO::FETCH_ASSOC);Lê o resultado retornado pelo banco e o converte para uma estrutura PHP que o restante do arquivo consegue consumir.
19 Linha em branco usada para separar blocos e melhorar a leitura.
20if(@count($res) == 0){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
21 echo 'Registro não encontrado';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
22 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
23}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
24 Linha em branco usada para separar blocos e melhorar a leitura.
25$modelo = trim(@$res[0]['modelo']);Inicializa `$modelo` já removendo espaços nas pontas, reduzindo ruído antes de validar ou salvar.
26$cor = trim(@$res[0]['cor']);Inicializa `$cor` já removendo espaços nas pontas, reduzindo ruído antes de validar ou salvar.
27$densidade = trim(@$res[0]['densidade']);Inicializa `$densidade` já removendo espaços nas pontas, reduzindo ruído antes de validar ou salvar.
28$tamanho = trim(@$res[0]['tamanho']);Inicializa `$tamanho` já removendo espaços nas pontas, reduzindo ruído antes de validar ou salvar.
29$observacoes = trim(@$res[0]['observacoes']);Inicializa `$observacoes` já removendo espaços nas pontas, reduzindo ruído antes de validar ou salvar.
30$foto_original = trim(@$res[0]['foto_original']);Inicializa `$foto_original` já removendo espaços nas pontas, reduzindo ruído antes de validar ou salvar.
31 Linha em branco usada para separar blocos e melhorar a leitura.
32$query2 = $pdo->query("SELECT * FROM config LIMIT 1");Executa uma consulta direta no banco. É um ponto que merece atenção extra quando houver dados vindos do usuário.
33$res2 = $query2->fetchAll(PDO::FETCH_ASSOC);Lê o resultado retornado pelo banco e o converte para uma estrutura PHP que o restante do arquivo consegue consumir.
34 Linha em branco usada para separar blocos e melhorar a leitura.
35if(@count($res2) == 0){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
36 echo 'Configurações não encontradas';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
37 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
38}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
39 Linha em branco usada para separar blocos e melhorar a leitura.
40$openai_key = trim(@$res2[0]['openai_key']);Inicializa `$openai_key` já removendo espaços nas pontas, reduzindo ruído antes de validar ou salvar.
41 Linha em branco usada para separar blocos e melhorar a leitura.
42if($openai_key == ""){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
43 echo 'OpenAI Key não cadastrada';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
44 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
45}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
46 Linha em branco usada para separar blocos e melhorar a leitura.
47if($foto_original == ""){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
48 echo 'Nenhuma foto original enviada';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
49 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
50}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
51 Linha em branco usada para separar blocos e melhorar a leitura.
52$pasta_upload = __DIR__ . '/../../images/simulacoes/';Define a variável `$pasta_upload`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
53 Linha em branco usada para separar blocos e melhorar a leitura.
54if(!is_dir($pasta_upload)){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
55 echo 'Pasta de imagens da simulação não encontrada';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
56 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
57}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
58 Linha em branco usada para separar blocos e melhorar a leitura.
59if(!is_readable($pasta_upload)){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
60 echo 'Pasta de imagens da simulação sem permissão de leitura';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
61 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
62}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
63 Linha em branco usada para separar blocos e melhorar a leitura.
64if(!is_writable($pasta_upload)){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
65 echo 'Pasta de imagens da simulação sem permissão de escrita';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
66 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
67}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
68 Linha em branco usada para separar blocos e melhorar a leitura.
69$caminho_foto = $pasta_upload . $foto_original;Define a variável `$caminho_foto`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
70 Linha em branco usada para separar blocos e melhorar a leitura.
71if(!file_exists($caminho_foto)){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
72 echo 'Arquivo da foto original não encontrado';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
73 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
74}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
75 Linha em branco usada para separar blocos e melhorar a leitura.
76if(!is_file($caminho_foto)){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
77 echo 'Arquivo da foto original inválido';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
78 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
79}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
80 Linha em branco usada para separar blocos e melhorar a leitura.
81if(!is_readable($caminho_foto)){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
82 echo 'Arquivo da foto original sem permissão de leitura';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
83 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
84}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
85 Linha em branco usada para separar blocos e melhorar a leitura.
86$extensao = strtolower(pathinfo($caminho_foto, PATHINFO_EXTENSION));Define a variável `$extensao`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
87$mime = 'image/jpeg';Define `$mime` com um valor literal usado como configuração local do arquivo.
88 Linha em branco usada para separar blocos e melhorar a leitura.
89if($extensao == 'png'){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
90 $mime = 'image/png';Define `$mime` com um valor literal usado como configuração local do arquivo.
91}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
92 Linha em branco usada para separar blocos e melhorar a leitura.
93if($extensao == 'webp'){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
94 $mime = 'image/webp';Define `$mime` com um valor literal usado como configuração local do arquivo.
95}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
96 Linha em branco usada para separar blocos e melhorar a leitura.
97$arquivo_curl = new CURLFile($caminho_foto, $mime, basename($caminho_foto));Define a variável `$arquivo_curl`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
98 Linha em branco usada para separar blocos e melhorar a leitura.
99/*Comentário do código. Serve para contextualizar o bloco seguinte para quem fizer manutenção.
100 Prompt travado do simuladorLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
101 Seguir exatamente o que o profissional definiuLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
102*/Comentário do código. Serve para contextualizar o bloco seguinte para quem fizer manutenção.
103$prompt = "Edite a imagem enviada criando uma simulacao fotografica profissional de protese capilar. ";Define `$prompt` com um valor literal usado como configuração local do arquivo.
104$prompt .= "Mantenha obrigatoriamente o mesmo rosto, expressao, angulo, proporcao da cabeca, fundo e enquadramento da foto original. ";Manipula uma variável PHP usada na construção do fluxo.
105$prompt .= "Nao alterar identidade da pessoa. Nao alterar sobrancelhas. Nao alterar barba. Nao alterar roupa. Nao alterar iluminacao de forma artificial. ";Manipula uma variável PHP usada na construção do fluxo.
106$prompt .= "A simulacao deve parecer resultado real de aplicacao profissional em clinica ou barbearia especializada. ";Manipula uma variável PHP usada na construção do fluxo.
107 Linha em branco usada para separar blocos e melhorar a leitura.
108$prompt .= "REGRA PRINCIPAL OBRIGATORIA: a simulacao deve seguir exatamente o que o profissional definiu no sistema. ";Manipula uma variável PHP usada na construção do fluxo.
109$prompt .= "Nao inventar outra cor. Nao inventar outra densidade. Nao inventar outro modelo. Nao suavizar grisalho. Nao reduzir percentual de branco. Nao aumentar percentual de branco. ";Manipula uma variável PHP usada na construção do fluxo.
110 Linha em branco usada para separar blocos e melhorar a leitura.
111$prompt .= "Sugestao de protese definida pelo profissional: " . $modelo . ". ";Manipula uma variável PHP usada na construção do fluxo.
112$prompt .= "Cor detectada definida pelo profissional: " . $cor . ". ";Manipula uma variável PHP usada na construção do fluxo.
113$prompt .= "Densidade definida pelo profissional: " . $densidade . ". ";Manipula uma variável PHP usada na construção do fluxo.
114$prompt .= "Tamanho informado: " . $tamanho . ". ";Manipula uma variável PHP usada na construção do fluxo.
115$prompt .= "Observacoes do profissional: " . $observacoes . ". ";Manipula uma variável PHP usada na construção do fluxo.
116 Linha em branco usada para separar blocos e melhorar a leitura.
117$prompt .= "Modelos permitidos no sistema: Micropele 0.04, Micropele 0.06, Micropele 0.08, Micropele 0.10. ";Manipula uma variável PHP usada na construção do fluxo.
118$prompt .= "Usar obrigatoriamente e exatamente o modelo definido pelo profissional, sem substituicao. ";Manipula uma variável PHP usada na construção do fluxo.
119 Linha em branco usada para separar blocos e melhorar a leitura.
120$prompt .= "Escala profissional de cores permitidas com percentual de branco: ";Manipula uma variável PHP usada na construção do fluxo.
121$prompt .= "#1B Preto natural. ";Manipula uma variável PHP usada na construção do fluxo.
122$prompt .= "#1B10 Preto natural + 10% branco. ";Manipula uma variável PHP usada na construção do fluxo.
123$prompt .= "#1B20 Preto natural + 20% branco. ";Manipula uma variável PHP usada na construção do fluxo.
124$prompt .= "#1B30 Preto natural + 30% branco. ";Manipula uma variável PHP usada na construção do fluxo.
125$prompt .= "#1B40 Preto natural + 40% branco. ";Manipula uma variável PHP usada na construção do fluxo.
126$prompt .= "#1B50 Preto natural + 50% branco. ";Manipula uma variável PHP usada na construção do fluxo.
127$prompt .= "#1B60 Preto natural + 60% branco. ";Manipula uma variável PHP usada na construção do fluxo.
128$prompt .= "#2 Castanho escuro. ";Manipula uma variável PHP usada na construção do fluxo.
129$prompt .= "#210 Castanho escuro + 10% branco. ";Manipula uma variável PHP usada na construção do fluxo.
130$prompt .= "#220 Castanho escuro + 20% branco. ";Manipula uma variável PHP usada na construção do fluxo.
131$prompt .= "#230 Castanho escuro + 30% branco. ";Manipula uma variável PHP usada na construção do fluxo.
132$prompt .= "#240 Castanho escuro + 40% branco. ";Manipula uma variável PHP usada na construção do fluxo.
133$prompt .= "#250 Castanho escuro + 50% branco. ";Manipula uma variável PHP usada na construção do fluxo.
134$prompt .= "#3 Castanho medio. ";Manipula uma variável PHP usada na construção do fluxo.
135$prompt .= "#310 Castanho medio + 10% branco. ";Manipula uma variável PHP usada na construção do fluxo.
136$prompt .= "#320 Castanho medio + 20% branco. ";Manipula uma variável PHP usada na construção do fluxo.
137$prompt .= "#330 Castanho medio + 30% branco. ";Manipula uma variável PHP usada na construção do fluxo.
138$prompt .= "#340 Castanho medio + 40% branco. ";Manipula uma variável PHP usada na construção do fluxo.
139$prompt .= "#4 Castanho. ";Manipula uma variável PHP usada na construção do fluxo.
140$prompt .= "#410 Castanho + 10% branco. ";Manipula uma variável PHP usada na construção do fluxo.
141$prompt .= "#420 Castanho + 20% branco. ";Manipula uma variável PHP usada na construção do fluxo.
142$prompt .= "#430 Castanho + 30% branco. ";Manipula uma variável PHP usada na construção do fluxo.
143$prompt .= "#440 Castanho + 40% branco. ";Manipula uma variável PHP usada na construção do fluxo.
144$prompt .= "#5 Castanho claro. ";Manipula uma variável PHP usada na construção do fluxo.
145$prompt .= "#6 Loiro escuro. ";Manipula uma variável PHP usada na construção do fluxo.
146 Linha em branco usada para separar blocos e melhorar a leitura.
147$prompt .= "Se a cor definida pelo profissional tiver percentual de branco, esse percentual deve aparecer visualmente na simulacao. ";Manipula uma variável PHP usada na construção do fluxo.
148$prompt .= "Exemplo: se a cor definida for #1B30, a simulacao deve mostrar preto natural com aproximadamente 30% de fios brancos ou grisalhos visiveis. ";Manipula uma variável PHP usada na construção do fluxo.
149$prompt .= "Exemplo: se a cor definida for #220, a simulacao deve mostrar castanho escuro com aproximadamente 20% de fios brancos ou grisalhos visiveis. ";Manipula uma variável PHP usada na construção do fluxo.
150$prompt .= "Exemplo: se a cor definida for #340, a simulacao deve mostrar castanho medio com aproximadamente 40% de fios brancos ou grisalhos visiveis. ";Manipula uma variável PHP usada na construção do fluxo.
151 Linha em branco usada para separar blocos e melhorar a leitura.
152$prompt .= "A IA deve respeitar obrigatoriamente o grisalho definido pelo profissional na cor detectada. ";Manipula uma variável PHP usada na construção do fluxo.
153$prompt .= "Nao transformar cor grisalha em cor solida. ";Manipula uma variável PHP usada na construção do fluxo.
154$prompt .= "Nao remover os fios brancos quando houver percentual de branco definido. ";Manipula uma variável PHP usada na construção do fluxo.
155$prompt .= "Nao adicionar fios brancos quando a cor definida nao tiver percentual de branco. ";Manipula uma variável PHP usada na construção do fluxo.
156 Linha em branco usada para separar blocos e melhorar a leitura.
157$prompt .= "Densidades permitidas no sistema: 80%, 100%, 130%, 150%. ";Manipula uma variável PHP usada na construção do fluxo.
158$prompt .= "Usar obrigatoriamente a densidade exatamente como informada pelo profissional, sem alterar volume para mais ou para menos. ";Manipula uma variável PHP usada na construção do fluxo.
159 Linha em branco usada para separar blocos e melhorar a leitura.
160$prompt .= "Requisitos visuais obrigatorios: ";Manipula uma variável PHP usada na construção do fluxo.
161$prompt .= "resultado extremamente natural, realista e profissional. ";Manipula uma variável PHP usada na construção do fluxo.
162$prompt .= "Respeitar linha frontal compativel com o caso real. ";Manipula uma variável PHP usada na construção do fluxo.
163$prompt .= "Respeitar direcao dos fios, implantacao, volume e cobertura coerentes com o modelo e densidade definidos. ";Manipula uma variável PHP usada na construção do fluxo.
164$prompt .= "Cobertura uniforme e acabamento invisivel na base. ";Manipula uma variável PHP usada na construção do fluxo.
165$prompt .= "Sem exagero de volume. ";Manipula uma variável PHP usada na construção do fluxo.
166$prompt .= "Sem aparencia de peruca. ";Manipula uma variável PHP usada na construção do fluxo.
167$prompt .= "Sem brilho plastico. ";Manipula uma variável PHP usada na construção do fluxo.
168$prompt .= "Sem bordas aparentes. ";Manipula uma variável PHP usada na construção do fluxo.
169$prompt .= "Nao inserir texto, marca dagua, moldura, elementos extras ou fundo novo. ";Manipula uma variável PHP usada na construção do fluxo.
170 Linha em branco usada para separar blocos e melhorar a leitura.
171$prompt .= "Resumo final obrigatorio: obedecer exatamente a cor detectada, inclusive percentual de branco, obedecer exatamente a densidade, e obedecer exatamente a sugestao de protese definida pelo profissional.";Manipula uma variável PHP usada na construção do fluxo.
172 Linha em branco usada para separar blocos e melhorar a leitura.
173$dados = array(Define a variável `$dados`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
174 'model' => 'gpt-image-1',Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
175 'prompt' => $prompt,Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
176 'size' => '1024x1536',Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
177 'quality' => 'medium',Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
178 'image' => $arquivo_curlLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
179);Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
180 Linha em branco usada para separar blocos e melhorar a leitura.
181$ch = curl_init();Define a variável `$ch`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
182curl_setopt($ch, CURLOPT_URL, "https://api.openai.com/v1/images/edits");Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
183curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
184curl_setopt($ch, CURLOPT_POST, true);Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
185curl_setopt($ch, CURLOPT_HTTPHEADER, array(Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
186 "Authorization: Bearer " . $openai_keyLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
187));Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
188curl_setopt($ch, CURLOPT_POSTFIELDS, $dados);Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
189 Linha em branco usada para separar blocos e melhorar a leitura.
190$resposta = curl_exec($ch);Define a variável `$resposta`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
191$http = curl_getinfo($ch, CURLINFO_HTTP_CODE);Define a variável `$http`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
192$erro = curl_error($ch);Define a variável `$erro`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
193curl_close($ch);Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
194 Linha em branco usada para separar blocos e melhorar a leitura.
195if($erro != ""){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
196 echo 'Erro ao gerar imagem: ' . $erro;Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
197 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
198}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
199 Linha em branco usada para separar blocos e melhorar a leitura.
200if($resposta == ""){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
201 echo 'Resposta vazia da IA';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
202 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
203}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
204 Linha em branco usada para separar blocos e melhorar a leitura.
205$resposta_decodificada = json_decode($resposta, true);Define a variável `$resposta_decodificada`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
206 Linha em branco usada para separar blocos e melhorar a leitura.
207if($http != 200){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
208 $mensagem_erro = 'Erro ao gerar imagem';Define `$mensagem_erro` com um valor literal usado como configuração local do arquivo.
209 Linha em branco usada para separar blocos e melhorar a leitura.
210 if(isset($resposta_decodificada['error']['message'])){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
211 $mensagem_erro = $resposta_decodificada['error']['message'];Define a variável `$mensagem_erro`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
212 }Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
213 Linha em branco usada para separar blocos e melhorar a leitura.
214 echo $mensagem_erro;Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
215 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
216}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
217 Linha em branco usada para separar blocos e melhorar a leitura.
218if(!isset($resposta_decodificada['data'][0]['b64_json'])){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
219 echo 'Resposta da IA inválida';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
220 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
221}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
222 Linha em branco usada para separar blocos e melhorar a leitura.
223$imagem_base64_saida = $resposta_decodificada['data'][0]['b64_json'];Define a variável `$imagem_base64_saida`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
224 Linha em branco usada para separar blocos e melhorar a leitura.
225if($imagem_base64_saida == ""){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
226 echo 'Imagem gerada inválida';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
227 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
228}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
229 Linha em branco usada para separar blocos e melhorar a leitura.
230$imagem_binaria = base64_decode($imagem_base64_saida);Define a variável `$imagem_binaria`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
231 Linha em branco usada para separar blocos e melhorar a leitura.
232if($imagem_binaria === false || $imagem_binaria == ""){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
233 echo 'Erro ao decodificar imagem gerada';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
234 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
235}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
236 Linha em branco usada para separar blocos e melhorar a leitura.
237$nome_img = md5(uniqid()) . '.png';Define a variável `$nome_img`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
238$caminho = $pasta_upload . $nome_img;Define a variável `$caminho`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
239 Linha em branco usada para separar blocos e melhorar a leitura.
240$salvou_imagem = file_put_contents($caminho, $imagem_binaria);Define a variável `$salvou_imagem`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
241 Linha em branco usada para separar blocos e melhorar a leitura.
242if($salvou_imagem === false){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
243 echo 'Erro ao salvar imagem gerada';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
244 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
245}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
246 Linha em branco usada para separar blocos e melhorar a leitura.
247if(!file_exists($caminho)){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
248 echo 'Arquivo da imagem gerada não foi gravado';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
249 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
250}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
251 Linha em branco usada para separar blocos e melhorar a leitura.
252$query3 = $pdo->query("SELECT * FROM $tabela WHERE id = '$id'");Centraliza o nome da tabela `$id` em uma variável, facilitando reaproveitamento do valor nas queries do arquivo.
253$res3 = $query3->fetchAll(PDO::FETCH_ASSOC);Lê o resultado retornado pelo banco e o converte para uma estrutura PHP que o restante do arquivo consegue consumir.
254 Linha em branco usada para separar blocos e melhorar a leitura.
255if(@count($res3) > 0){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
256 $imagem_antiga = $res3[0]['imagem_simulada'];Define a variável `$imagem_antiga`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
257 Linha em branco usada para separar blocos e melhorar a leitura.
258 if($imagem_antiga != ""){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
259 $caminho_antigo = $pasta_upload . $imagem_antiga;Define a variável `$caminho_antigo`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
260 Linha em branco usada para separar blocos e melhorar a leitura.
261 if(file_exists($caminho_antigo)){Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
262 @unlink($caminho_antigo);Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
263 }Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
264 }Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
265}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
266 Linha em branco usada para separar blocos e melhorar a leitura.
267$query4 = $pdo->prepare("UPDATE $tabela SET imagem_simulada = :imagem_simulada WHERE id = '$id'");Centraliza o nome da tabela `$id` em uma variável, facilitando reaproveitamento do valor nas queries do arquivo.
268$query4->bindValue(":imagem_simulada", $nome_img);Associa um valor PHP a um parâmetro nomeado da query preparada.
269$query4->execute();Executa a query preparada no banco de dados.
270 Linha em branco usada para separar blocos e melhorar a leitura.
271echo 'Salvo com Sucesso';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
272?>Fecha o bloco PHP atual para voltar à saída HTML.

Navegação entre arquivos do grupo