PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 25 → PNG comprimido e com borda transparente perfeita
PNG comprimido e com borda transparente perfeita
Iniciado por Boller, jun., 09 2020 3:02 PM - Sem resposta
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em junho, 09 2020 - 3:02 PM
Usando o https://pngquant.org/

PNG transparente perfeito

Procedure CompressIMG(sFile, sSave = "", nWidth = 0, nColor = LightMagenta)
// Este script tenta reduzir o tamanho da imagem PNG sem perda de qualidade aparente.
// Para isso ele depende de um utilitário externo o PNG Quant. (https://pngquant.org/)
// Independente do formato da imagem original, o resultado final será um arquivo PNG de 8 Bits sem metadados ou dados EXIF.
// Essa função Retorna um valor para avisar se a compactação foi um sucesso.
// ======================
// sFile = Caminho completo do arquivo de imagem
// sSave = (Opcional) Diretório para salvar o arquivo comprimido, se não for definido irá substituir a imagem original.
// nWidth = (Opcional) Largura desejada da imagem, a altura será calculada mantendo a proporção atual da imagem
// nColor = (Opcional) Apenas para imagens PNG se forem redimensionadas, define a cor a ser considerada transparente)
// ======================
// Result [True / False] - Retorna True se o arquivo comprimido for menor que o original, Retorna False se não conseguiu comprimir.
// ======================
// Define as variáveis e valores iniciais
Image is Image
nOriginalSize is int = fSize(sFile)
nCompressSize is int = 0
nOX is int
nOY is int
nRatio is numeric
sPNGQ is string = fExeDir + "\Lib\pngquant.exe" // Diretório do PNG Quantum

// Carrega a Imagem de qualquer formato
Image = dLoadImage(sFile)


// Se foi mandado redimensionar
IF nWidth > 0 THEN
// Calcula a Proporção da imagem original
nOX = Image..Width
nOY = Image..Height
nRatio = nOX / nOY

// Define o tamanho novo da imagem de acordo com o Width desejado e a proporção original (Height: 100%).
IF nOX > nOY THEN
dResize(Image, nWidth, Round(nWidth / nRatio),drHighQuality+drHomothetic)
ELSE
dResize(Image, nWidth, Round(nWidth * nRatio),drHighQuality+drHomothetic)
END
END

// Se o parâmetro sSave (Diretório de salvamento) não for especificado, salvar no mesmo local de sFile com o mesmo nome.
IF sSave = "" THEN
sSave = sFile
END

// Verifica se é PNG ou JPG e escolhe o melhor método
IF fExtractPath(sFile,fExtension) ~~ ".png" THEN // Se PNG

// Salva a mudança na resolução se ela existiu.
IF nWidth > 0 THEN
dSaveImagePNG(Image, sSave, nColor)
ELSE
fCopyFile(sFile, sSave)
END

// Executa PNGQuant para comprimir a imagem para 8 Bits e remover metadados, processo feito em 2 steps pra maior compressão.
ExeRun(StringBuild([
"%1" %2 "%3"
], sPNGQ, "--f --ext=.png --skip-if-larger --strip --nofs --quiet --quality=45-80", sSave), exeIconize, exeWait)
ExeRun(StringBuild([
"%1" %2 "%3"
], sPNGQ, "--f --ext=.png --skip-if-larger --strip --nofs -quiet --ordered --speed=1 --quality=50-85", sSave), exeIconize, exeWait)

// Verifica se a compressão foi um sucesso
nCompressSize = fSize(sSave)
IF nCompressSize > 0 _AND_ nCompressSize < nOriginalSize THEN
RESULT True
END

ELSE IF fExtractPath(sFile,fExtension) ~~ ".jpg" _OR_ fExtractPath(sFile,fExtension) ~~ ".jpeg" THEN // Se JPG
sSave = fExtractPath(sSave,fFileName+fDirectory+fDrive) + "_temp.jpg"
IF dSaveImageJPEG(Image, sSave, 65) THEN // Converte pra JPEG 65%
// Verifica se a compressão foi um sucesso
nCompressSize = fSize(sSave)
IF nCompressSize > 0 _AND_ nCompressSize < nOriginalSize THEN
// Se for, substitui o arquivo original.
fDelete(sFile)
fRename(sSave, sFile)
RESULT True
END
END
END

RESULT False

by Laerte / Bruno


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/