@@ -38,7 +38,7 @@ } return $null
}
-function Salvar-Config($entrada, $formato, $modo, $valor) {
+function Salvar-Config($entrada, $formato, $modo, $valor, $saida) {
try {
New-Item -ItemType Directory -Path $configDir -Force | Out-Null
[pscustomobject]@{
@@ -46,6 +46,7 @@ UltimaEntrada = $entrada UltimoFormato = $formato
UltimoModo = $modo
UltimoValor = $valor
+ UltimaSaida = $saida
} | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8
} catch {}
}
@@ -230,7 +231,20 @@ else { $resumoTam = 'sem redimensionar'
}
-Salvar-Config $origem $formato.Id $modo $valor
+# Pasta de saída (lembra a última; cria se não existir)
+$saidaPadrao = if ($config -and $config.UltimaSaida) { $config.UltimaSaida } else { $destino }
+while ($true) {
+ Titulo 'Pasta de saída'
+ Write-Host " $saidaPadrao" -ForegroundColor White
+ Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray
+ $rsaida = Read-Host 'Pasta de saída'
+ $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+ try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+ catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+}
+$destino = (Resolve-Path -LiteralPath $destino).Path
+
+Salvar-Config $origem $formato.Id $modo $valor $destino
# ------------------------------------------------------------
# 5) Coleta das imagens
@@ -21,6 +21,10 @@ Write-Host '============================================================' -ForegroundColor DarkCyan }
$extImg = @('.jpg','.jpeg','.png','.webp','.bmp','.tif','.tiff')
+$configDir = Join-Path $env:APPDATA 'ImagensEPdf'
+$configFile = Join-Path $configDir 'config.json'
+function Carregar-Config { if (Test-Path -LiteralPath $configFile) { try { return Get-Content -LiteralPath $configFile -Raw -Encoding UTF8 | ConvertFrom-Json } catch {} }; return $null }
+function Salvar-Config($o) { try { New-Item -ItemType Directory -Path $configDir -Force | Out-Null; $o | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8 } catch {} }
Titulo 'Imagens e PDF'
Write-Host ' Desenvolvido por Pablo Murad - 2026' -ForegroundColor DarkGray
@@ -29,6 +33,7 @@ Write-Host 'Verificando o que é necessário...' -ForegroundColor Gray $magick = Get-Command magick -ErrorAction SilentlyContinue
if (-not $magick) { Write-Host ''; Write-Host '[ERRO] ImageMagick não encontrado.' -ForegroundColor Red; Write-Host 'Instale com: winget install ImageMagick.ImageMagick' -ForegroundColor White; Pausar; exit 1 }
Write-Host "[OK] ImageMagick: $($magick.Source)" -ForegroundColor Green
+$config = Carregar-Config
Titulo 'O que você quer fazer?'
Write-Host ' [1] Imagens -> PDF (junta todas as imagens de uma pasta num PDF)' -ForegroundColor White
@@ -51,7 +56,19 @@ Write-Host "$($imagens.Count) imagens encontradas (em ordem alfabética)." -ForegroundColor Cyan $nome = (Read-Host 'Nome do PDF de saída (Enter = saida.pdf)').Trim()
if ([string]::IsNullOrWhiteSpace($nome)) { $nome = 'saida.pdf' }
if ($nome -notmatch '\.pdf$') { $nome += '.pdf' }
- $pdf = Join-Path $pasta $nome
+ $saidaPadrao = if ($config -and $config.UltimaSaidaPdf) { $config.UltimaSaidaPdf } else { $pasta }
+ while ($true) {
+ Titulo 'Pasta de saída'
+ Write-Host " $saidaPadrao" -ForegroundColor White
+ Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray
+ $rsaida = Read-Host 'Pasta de saída'
+ $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+ try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+ catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+ }
+ $destino = (Resolve-Path -LiteralPath $destino).Path
+ Salvar-Config ([pscustomobject]@{ UltimaSaidaPdf=$destino; UltimaSaidaImg=($config.UltimaSaidaImg) })
+ $pdf = Join-Path $destino $nome
Write-Host ''; Write-Host "Gerando: $pdf ..." -ForegroundColor Cyan
$imgArgs = @($imagens.FullName) + @('-auto-orient', $pdf)
& magick @imgArgs
@@ -82,10 +99,25 @@ if ($modoArquivo) { $pdfs = @(Get-Item -LiteralPath $pdfAlvo) } else { $pdfs = @(Get-ChildItem -LiteralPath $pdfAlvo -File | Where-Object { $_.Extension.ToLowerInvariant() -eq '.pdf' }) }
if ($pdfs.Count -eq 0) { Write-Host 'Nenhum PDF encontrado.' -ForegroundColor Yellow; Pausar; exit 0 }
+$baseSaida = if ($modoArquivo) { Split-Path $pdfAlvo -Parent } else { $pdfAlvo }
+$saidaPadrao = if ($config -and $config.UltimaSaidaImg) { $config.UltimaSaidaImg } else { $baseSaida }
+while ($true) {
+ Titulo 'Pasta de saída (base)'
+ Write-Host " $saidaPadrao" -ForegroundColor White
+ Write-Host '(cada PDF cria uma subpasta <nome>-imagens aqui dentro)' -ForegroundColor DarkGray
+ Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray
+ $rsaida = Read-Host 'Pasta de saída'
+ $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+ try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+ catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+}
+$destino = (Resolve-Path -LiteralPath $destino).Path
+Salvar-Config ([pscustomobject]@{ UltimaSaidaPdf=($config.UltimaSaidaPdf); UltimaSaidaImg=$destino })
+
Titulo 'Processando'
$ok=0;$err=0
foreach ($pf in $pdfs) {
- $outDir = Join-Path $pf.DirectoryName ($pf.BaseName + '-imagens')
+ $outDir = Join-Path $destino ($pf.BaseName + '-imagens')
New-Item -ItemType Directory -Path $outDir -Force | Out-Null
$padraoSaida = Join-Path $outDir ('pagina-%03d' + $extSaida)
Write-Host ''; Write-Host $pf.Name -ForegroundColor Magenta
@@ -88,7 +88,20 @@ while (-not $posicao) { $e = Read-Host 'Posição (1-5, Enter = 1)'; if ([string]::IsNullOrWhiteSpace($e)) { $e = '1' }; $posicao = $posicoes | Where-Object { $_.Id -eq ($e -as [int]) } | Select-Object -First 1; if (-not $posicao) { Write-Host '[!] Inválido.' -ForegroundColor Yellow } } $grav = $posicao.Gravity
$offset = if ($grav -eq 'Center') { '+0+0' } else { '+25+25' }
-Salvar-Config ([pscustomobject]@{ UltimaEntrada=$origem; UltimoTipo=$tipo; UltimoTexto=$texto; UltimoLogo=$logo; UltimaPosicao=$posicao.Id })
+# Pasta de saída (lembra a última; cria se não existir)
+$saidaPadrao = if ($config -and $config.UltimaSaida) { $config.UltimaSaida } else { $destino }
+while ($true) {
+ Titulo 'Pasta de saída'
+ Write-Host " $saidaPadrao" -ForegroundColor White
+ Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray
+ $rsaida = Read-Host 'Pasta de saída'
+ $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+ try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+ catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+}
+$destino = (Resolve-Path -LiteralPath $destino).Path
+
+Salvar-Config ([pscustomobject]@{ UltimaEntrada=$origem; UltimoTipo=$tipo; UltimoTexto=$texto; UltimoLogo=$logo; UltimaPosicao=$posicao.Id; UltimaSaida=$destino })
# Coleta
if ($modoArquivo) { $arquivos = @($arquivoObj) } else {
@@ -20,6 +20,11 @@ Write-Host " $t" -ForegroundColor Cyan Write-Host '============================================================' -ForegroundColor DarkCyan
}
+$configDir = Join-Path $env:APPDATA 'CriarGif'
+$configFile = Join-Path $configDir 'config.json'
+function Carregar-Config { if (Test-Path -LiteralPath $configFile) { try { return Get-Content -LiteralPath $configFile -Raw -Encoding UTF8 | ConvertFrom-Json } catch {} }; return $null }
+function Salvar-Config($o) { try { New-Item -ItemType Directory -Path $configDir -Force | Out-Null; $o | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8 } catch {} }
+
$extVideo = @('.mp4','.mkv','.avi','.mov','.wmv','.flv','.webm','.m4v','.mpg','.mpeg','.ts','.3gp','.vob')
$extImg = @('.jpg','.jpeg','.png','.webp','.bmp','.tif','.tiff')
@@ -30,6 +35,7 @@ Write-Host 'Verificando o que é necessário...' -ForegroundColor Gray $ffmpeg = Get-Command ffmpeg -ErrorAction SilentlyContinue
if (-not $ffmpeg) { Write-Host ''; Write-Host '[ERRO] FFmpeg não encontrado.' -ForegroundColor Red; Write-Host 'Instale com: winget install Gyan.FFmpeg' -ForegroundColor White; Pausar; exit 1 }
Write-Host "[OK] FFmpeg: $($ffmpeg.Source)" -ForegroundColor Green
+$config = Carregar-Config
Titulo 'O que você quer fazer?'
Write-Host ' [1] Vídeo -> GIF' -ForegroundColor White
@@ -56,6 +62,20 @@ if ($modoArquivo) { $arquivoObj = Get-Item -LiteralPath $arquivoUnico; $origem = $arquivoObj.DirectoryName; $videos = @($arquivoObj) } else { $origem = $entrada; $videos = @(Get-ChildItem -LiteralPath $origem -File | Where-Object { $extVideo -contains $_.Extension.ToLowerInvariant() }) }
$destino = Join-Path $origem 'GIF'
+ # Pasta de saída (lembra a última; cria se não existir)
+ $saidaPadrao = if ($config -and $config.UltimaSaidaGif) { $config.UltimaSaidaGif } else { $destino }
+ while ($true) {
+ Titulo 'Pasta de saída'
+ Write-Host " $saidaPadrao" -ForegroundColor White
+ Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray
+ $rsaida = Read-Host 'Pasta de saída'
+ $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+ try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+ catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+ }
+ $destino = (Resolve-Path -LiteralPath $destino).Path
+ Salvar-Config ([pscustomobject]@{ UltimaSaidaGif=$destino; UltimaSaidaSlide=($config.UltimaSaidaSlide) })
+
Titulo 'Processando'
Write-Host "Largura: $larg px | FPS: $fps | Destino: $destino"
Write-Host "Vídeos: $($videos.Count)" -ForegroundColor Cyan
@@ -98,7 +118,20 @@ $sEnt = Read-Host 'Segundos por foto (Enter = 2)'; $seg = if ($sEnt -as [double]) { [double]$sEnt } else { 2 } $nome = (Read-Host 'Nome do vídeo de saída (Enter = slideshow.mp4)').Trim()
if ([string]::IsNullOrWhiteSpace($nome)) { $nome = 'slideshow.mp4' }
if ($nome -notmatch '\.mp4$') { $nome += '.mp4' }
-$saida = Join-Path $pasta $nome
+# Pasta de saída (lembra a última; cria se não existir)
+$saidaPadrao = if ($config -and $config.UltimaSaidaSlide) { $config.UltimaSaidaSlide } else { $pasta }
+while ($true) {
+ Titulo 'Pasta de saída'
+ Write-Host " $saidaPadrao" -ForegroundColor White
+ Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray
+ $rsaida = Read-Host 'Pasta de saída'
+ $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+ try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+ catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+}
+$destino = (Resolve-Path -LiteralPath $destino).Path
+Salvar-Config ([pscustomobject]@{ UltimaSaidaGif=($config.UltimaSaidaGif); UltimaSaidaSlide=$destino })
+$saida = Join-Path $destino $nome
# Monta arquivo de lista para o demuxer concat (caminhos com / e aspas)
$listaTxt = Join-Path $env:TEMP ("slide_{0}.txt" -f ([guid]::NewGuid().ToString('N')))
@@ -38,10 +38,10 @@ } return $null
}
-function Salvar-Config($pasta, $qualidade) {
+function Salvar-Config($pasta, $qualidade, $saida) {
try {
New-Item -ItemType Directory -Path $configDir -Force | Out-Null
- [pscustomobject]@{ UltimaPasta = $pasta; UltimaQualidade = $qualidade } |
+ [pscustomobject]@{ UltimaPasta = $pasta; UltimaQualidade = $qualidade; UltimaSaida = $saida } |
ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8
} catch {}
}
@@ -172,7 +172,20 @@ $perfil = $perfis | Where-Object { $_.Id -eq ($escolha -as [int]) } | Select-Object -First 1 if (-not $perfil) { Write-Host '[!] Escolha inválida. Digite um número de 1 a 5.' -ForegroundColor Yellow }
}
-Salvar-Config $origem $perfil.Id
+# Pasta de saída (lembra a última; cria se não existir)
+$saidaPadrao = if ($config -and $config.UltimaSaida) { $config.UltimaSaida } else { $destino }
+while ($true) {
+ Titulo 'Pasta de saída'
+ Write-Host " $saidaPadrao" -ForegroundColor White
+ Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray
+ $rsaida = Read-Host 'Pasta de saída'
+ $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+ try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+ catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+}
+$destino = (Resolve-Path -LiteralPath $destino).Path
+
+Salvar-Config $origem $perfil.Id $destino
# ------------------------------------------------------------
# 4) Coleta dos arquivos de vídeo