<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><category>pcsoft.br.windev</category><copyright>Copyright 2026, PC SOFT</copyright><lastBuildDate>4 Nov 2025 15:57:16 Z</lastBuildDate><pubDate>4 Nov 2025 15:57:16 Z</pubDate><description>Vou criar uma classe OOP WLanguage completa para processamento forense de imagens com Motion Deblur, baseada no procedimento que você descreveu:&#13;
&#13;
```wlanguage&#13;
//==============================================================================&#13;
// Classe: CMotionDeblur&#13;
// Descrição: Classe para processamento forense de imagens com correção de &#13;
//            Motion Blur (desfoque de movimento)&#13;
// Autor: Sistema&#13;
// Data: 04/11/2025&#13;
//==============================================================================&#13;
&#13;
CMotionDeblur is Class&#13;
	&#13;
	//--------------------------------------------------------------------------&#13;
	// DECLARAÇÃO DE MEMBROS PRIVADOS&#13;
	//--------------------------------------------------------------------------&#13;
	PRIVATE&#13;
		m_sImagemOriginal is string			// Caminho da imagem original&#13;
		m_imgProcessada is Image			// Objeto Image para processamento&#13;
		m_nLarguraOriginal is int			// Largura original&#13;
		m_nAlturaOriginal is int			// Altura original&#13;
		m_rFatorEsticamento is real = 1.0	// Fator de alongamento detectado&#13;
		m_nAnguloBorrão is int = 0			// Ângulo do motion blur&#13;
		m_nDeslocamento is int = 0			// Deslocamento do blur em pixels&#13;
		m_rSNR is real = 100.0				// Signal-to-Noise Ratio&#13;
		m_bImagemCarregada is boolean = False&#13;
		m_sUltimoErro is string = ""&#13;
	END&#13;
	&#13;
	//--------------------------------------------------------------------------&#13;
	// DECLARAÇÃO DE MEMBROS PÚBLICOS&#13;
	//--------------------------------------------------------------------------&#13;
	PUBLIC&#13;
		// Propriedades de leitura&#13;
		PROPERTY LarguraImagem, read = m_nLarguraOriginal&#13;
		PROPERTY AlturaImagem, read = m_nAlturaOriginal&#13;
		PROPERTY FatorEsticamento, read = m_rFatorEsticamento&#13;
		PROPERTY AnguloBlur, read = m_nAnguloBorrão&#13;
		PROPERTY Deslocamento, read = m_nDeslocamento&#13;
		PROPERTY UltimoErro, read = m_sUltimoErro&#13;
		PROPERTY ImagemCarregada, read = m_bImagemCarregada&#13;
	END&#13;
	&#13;
END&#13;
&#13;
//==============================================================================&#13;
// CONSTRUTOR&#13;
//==============================================================================&#13;
PROCEDURE Constructor()&#13;
	m_bImagemCarregada = False&#13;
	m_sUltimoErro = ""&#13;
END&#13;
&#13;
//==============================================================================&#13;
// DESTRUTOR&#13;
//==============================================================================&#13;
PROCEDURE Destructor()&#13;
	// Libera recursos se necessário&#13;
	IF m_bImagemCarregada THEN&#13;
		m_imgProcessada = Null&#13;
	END&#13;
END&#13;
&#13;
//==============================================================================&#13;
// Método: CarregarImagem&#13;
// Descrição: Carrega a imagem inicial para processamento&#13;
// Parâmetros:&#13;
//   - sCaminhoImagem: Caminho completo da imagem&#13;
// Retorno: True se sucesso, False caso contrário&#13;
//==============================================================================&#13;
PROCEDURE PUBLIC CarregarImagem(LOCAL sCaminhoImagem is string): boolean&#13;
&#13;
	// Valida parâmetros&#13;
	IF sCaminhoImagem = "" THEN&#13;
		m_sUltimoErro = "Caminho da imagem não informado"&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	IF NOT fFileExist(sCaminhoImagem) THEN&#13;
		m_sUltimoErro = StringBuild("Arquivo não encontrado: %1", sCaminhoImagem)&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	// Carrega a imagem&#13;
	m_imgProcessada = dLoadImage(sCaminhoImagem)&#13;
	&#13;
	IF m_imgProcessada..Width = 0 OR m_imgProcessada..Height = 0 THEN&#13;
		m_sUltimoErro = "Falha ao carregar a imagem. Formato inválido?"&#13;
		m_bImagemCarregada = False&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	// Armazena informações&#13;
	m_sImagemOriginal = sCaminhoImagem&#13;
	m_nLarguraOriginal = m_imgProcessada..Width&#13;
	m_nAlturaOriginal = m_imgProcessada..Height&#13;
	m_bImagemCarregada = True&#13;
	m_sUltimoErro = ""&#13;
	&#13;
	RESULT True&#13;
	&#13;
END&#13;
&#13;
//==============================================================================&#13;
// Método: MedirEsticamento&#13;
// Descrição: Calcula o fator de esticamento medindo um objeto circular&#13;
// Parâmetros:&#13;
//   - nDiametroX: Diâmetro horizontal medido (em pixels)&#13;
//   - nDiametroY: Diâmetro vertical medido (em pixels)&#13;
// Retorno: Fator de esticamento calculado&#13;
//==============================================================================&#13;
PROCEDURE PUBLIC MedirEsticamento(LOCAL nDiametroX is int, LOCAL nDiametroY is int): real&#13;
&#13;
	LOCAL rFator is real&#13;
	&#13;
	IF nDiametroX &lt;= 0 OR nDiametroY &lt;= 0 THEN&#13;
		m_sUltimoErro = "Diâmetros inválidos para cálculo"&#13;
		RESULT 1.0&#13;
	END&#13;
	&#13;
	// Calcula a razão entre os diâmetros&#13;
	rFator = nDiametroX / nDiametroY&#13;
	&#13;
	m_rFatorEsticamento = rFator&#13;
	&#13;
	RESULT rFator&#13;
	&#13;
END&#13;
&#13;
//==============================================================================&#13;
// Método: CorrigirEsticamento&#13;
// Descrição: Corrige o esticamento da imagem aplicando escala&#13;
// Parâmetros:&#13;
//   - bDirecaoHorizontal: True para corrigir horizontalmente, False para vertical&#13;
// Retorno: True se sucesso, False caso contrário&#13;
//==============================================================================&#13;
PROCEDURE PUBLIC CorrigirEsticamento(LOCAL bDirecaoHorizontal is boolean = True): boolean&#13;
&#13;
	LOCAL nNovaLargura, nNovaAltura is int&#13;
	LOCAL rFatorCorrecao is real&#13;
	&#13;
	IF NOT m_bImagemCarregada THEN&#13;
		m_sUltimoErro = "Nenhuma imagem carregada"&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	IF m_rFatorEsticamento = 1.0 THEN&#13;
		// Sem esticamento detectado&#13;
		RESULT True&#13;
	END&#13;
	&#13;
	// Calcula o fator de correção (inverso do esticamento)&#13;
	rFatorCorrecao = 1.0 / m_rFatorEsticamento&#13;
	&#13;
	// Aplica a correção na direção apropriada&#13;
	IF bDirecaoHorizontal THEN&#13;
		// Corrige horizontalmente&#13;
		nNovaLargura = Round(m_nLarguraOriginal * rFatorCorrecao, 0)&#13;
		nNovaAltura = m_nAlturaOriginal&#13;
	ELSE&#13;
		// Corrige verticalmente&#13;
		nNovaLargura = m_nLarguraOriginal&#13;
		nNovaAltura = Round(m_nAlturaOriginal * rFatorCorrecao, 0)&#13;
	END&#13;
	&#13;
	// Redimensiona a imagem&#13;
	dResize(m_imgProcessada, nNovaLargura, nNovaAltura, drHomothetic)&#13;
	&#13;
	// Atualiza dimensões&#13;
	m_nLarguraOriginal = nNovaLargura&#13;
	m_nAlturaOriginal = nNovaAltura&#13;
	&#13;
	RESULT True&#13;
	&#13;
END&#13;
&#13;
//==============================================================================&#13;
// Método: MedirLinhaBlur&#13;
// Descrição: Mede a linha do blur para determinar ângulo e deslocamento&#13;
// Parâmetros:&#13;
//   - nX1, nY1: Ponto inicial da linha&#13;
//   - nX2, nY2: Ponto final da linha&#13;
// Retorno: True se sucesso&#13;
//==============================================================================&#13;
PROCEDURE PUBLIC MedirLinhaBlur(LOCAL nX1 is int, LOCAL nY1 is int, LOCAL nX2 is int, LOCAL nY2 is int): boolean&#13;
&#13;
	LOCAL rDistancia is real&#13;
	LOCAL rAngulo is real&#13;
	&#13;
	IF NOT m_bImagemCarregada THEN&#13;
		m_sUltimoErro = "Nenhuma imagem carregada"&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	// Calcula a distância (deslocamento do blur)&#13;
	rDistancia = SquareRoot((nX2 - nX1)^2 + (nY2 - nY1)^2)&#13;
	m_nDeslocamento = Round(rDistancia, 0)&#13;
	&#13;
	// Calcula o ângulo em graus&#13;
	IF nX2 = nX1 THEN&#13;
		// Linha vertical&#13;
		m_nAnguloBorrão = 90&#13;
	ELSE&#13;
		rAngulo = ATan((nY2 - nY1) / (nX2 - nX1))&#13;
		m_nAnguloBorrão = Round(rAngulo * 180 / PI, 0)&#13;
	END&#13;
	&#13;
	RESULT True&#13;
	&#13;
END&#13;
&#13;
//==============================================================================&#13;
// Método: AplicarMotionDeblur&#13;
// Descrição: Aplica o algoritmo de Motion Deblur&#13;
// Parâmetros:&#13;
//   - nDeslocamento: Deslocamento do blur em pixels (opcional, usa medição se 0)&#13;
//   - nAngulo: Ângulo do blur em graus (opcional, usa medição se 0)&#13;
//   - rSNR: Signal-to-Noise Ratio (padrão: 100.0)&#13;
// Retorno: True se sucesso&#13;
//==============================================================================&#13;
PROCEDURE PUBLIC AplicarMotionDeblur(LOCAL nDeslocamento is int = 0, LOCAL nAngulo is int = 0, LOCAL rSNR is real = 100.0): boolean&#13;
&#13;
	LOCAL imgTemp is Image&#13;
	LOCAL nShift, nAngle is int&#13;
	&#13;
	IF NOT m_bImagemCarregada THEN&#13;
		m_sUltimoErro = "Nenhuma imagem carregada"&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	// Usa valores medidos se não fornecidos&#13;
	nShift = nDeslocamento&#13;
	IF nShift = 0 THEN nShift = m_nDeslocamento&#13;
	&#13;
	nAngle = nAngulo&#13;
	IF nAngle = 0 THEN nAngle = m_nAnguloBorrão&#13;
	&#13;
	IF nShift = 0 THEN&#13;
		m_sUltimoErro = "Deslocamento não medido. Use MedirLinhaBlur primeiro."&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	m_rSNR = rSNR&#13;
	&#13;
	// NOTA: WLanguage não possui função nativa de Motion Deblur&#13;
	// Esta é uma implementação simplificada usando filtros disponíveis&#13;
	&#13;
	// Aplica sharpen (nitidez) como aproximação&#13;
	imgTemp = dCopy(m_imgProcessada)&#13;
	&#13;
	// Filtro de nitidez baseado no deslocamento&#13;
	LOCAL nIntensidade is int = Min(nShift * 2, 100)&#13;
	&#13;
	dSharpen(imgTemp, nIntensidade)&#13;
	&#13;
	// Aplica rotação se necessário (baseado no ângulo)&#13;
	IF nAngle &lt;&gt; 0 THEN&#13;
		dRotation(imgTemp, -nAngle, drNoEnlarging)&#13;
	END&#13;
	&#13;
	m_imgProcessada = imgTemp&#13;
	&#13;
	RESULT True&#13;
	&#13;
END&#13;
&#13;
//==============================================================================&#13;
// Método: AjustarBrilhoContraste&#13;
// Descrição: Ajusta brilho e contraste da imagem&#13;
// Parâmetros:&#13;
//   - nBrilho: Ajuste de brilho (-100 a +100, 0 = sem alteração)&#13;
//   - nContraste: Ajuste de contraste (-100 a +100, 0 = sem alteração)&#13;
// Retorno: True se sucesso&#13;
//==============================================================================&#13;
PROCEDURE PUBLIC AjustarBrilhoContraste(LOCAL nBrilho is int = 0, LOCAL nContraste is int = 50): boolean&#13;
&#13;
	IF NOT m_bImagemCarregada THEN&#13;
		m_sUltimoErro = "Nenhuma imagem carregada"&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	// Valida parâmetros&#13;
	nBrilho = Max(-100, Min(100, nBrilho))&#13;
	nContraste = Max(-100, Min(100, nContraste))&#13;
	&#13;
	// Ajusta brilho&#13;
	IF nBrilho &lt;&gt; 0 THEN&#13;
		dModifyLuminosity(m_imgProcessada, nBrilho)&#13;
	END&#13;
	&#13;
	// Ajusta contraste&#13;
	IF nContraste &lt;&gt; 0 THEN&#13;
		dModifyContrast(m_imgProcessada, nContraste)&#13;
	END&#13;
	&#13;
	RESULT True&#13;
	&#13;
END&#13;
&#13;
//==============================================================================&#13;
// Método: RecortarArea&#13;
// Descrição: Recorta uma área específica da imagem (crop)&#13;
// Parâmetros:&#13;
//   - nX, nY: Coordenadas do canto superior esquerdo&#13;
//   - nLargura, nAltura: Dimensões da área a recortar&#13;
// Retorno: True se sucesso&#13;
//==============================================================================&#13;
PROCEDURE PUBLIC RecortarArea(LOCAL nX is int, LOCAL nY is int, LOCAL nLargura is int, LOCAL nAltura is int): boolean&#13;
&#13;
	LOCAL imgRecortada is Image&#13;
	&#13;
	IF NOT m_bImagemCarregada THEN&#13;
		m_sUltimoErro = "Nenhuma imagem carregada"&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	// Valida coordenadas&#13;
	IF nX &lt; 0 OR nY &lt; 0 OR nLargura &lt;= 0 OR nAltura &lt;= 0 THEN&#13;
		m_sUltimoErro = "Coordenadas de recorte inválidas"&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	IF nX + nLargura &gt; m_imgProcessada..Width OR nY + nAltura &gt; m_imgProcessada..Height THEN&#13;
		m_sUltimoErro = "Área de recorte excede os limites da imagem"&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	// Cria nova imagem com a área recortada&#13;
	imgRecortada..Width = nLargura&#13;
	imgRecortada..Height = nAltura&#13;
	&#13;
	dStartDrawing(imgRecortada)&#13;
	dCopyImage(m_imgProcessada, imgRecortada, copySrcCopy, nX, nY, nLargura, nAltura, 0, 0)&#13;
	dEndDrawing(imgRecortada)&#13;
	&#13;
	m_imgProcessada = imgRecortada&#13;
	m_nLarguraOriginal = nLargura&#13;
	m_nAlturaOriginal = nAltura&#13;
	&#13;
	RESULT True&#13;
	&#13;
END&#13;
&#13;
//==============================================================================&#13;
// Método: ProcessamentoCompleto&#13;
// Descrição: Executa o fluxo completo de processamento forense&#13;
// Parâmetros:&#13;
//   - stParametros: Estrutura com todos os parâmetros necessários&#13;
// Retorno: True se sucesso&#13;
//==============================================================================&#13;
PROCEDURE PUBLIC ProcessamentoCompleto(LOCAL stParametros is STParametrosDeblur): boolean&#13;
&#13;
	IF NOT m_bImagemCarregada THEN&#13;
		m_sUltimoErro = "Nenhuma imagem carregada"&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	// 1. Correção de esticamento (se necessário)&#13;
	IF stParametros.bCorrigirEsticamento THEN&#13;
		IF NOT CorrigirEsticamento(stParametros.bDirecaoHorizontal) THEN&#13;
			RESULT False&#13;
		END&#13;
	END&#13;
	&#13;
	// 2. Aplicar Motion Deblur&#13;
	IF NOT AplicarMotionDeblur(stParametros.nDeslocamento, stParametros.nAngulo, stParametros.rSNR) THEN&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	// 3. Ajustar Brilho e Contraste&#13;
	IF NOT AjustarBrilhoContraste(stParametros.nBrilho, stParametros.nContraste) THEN&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	// 4. Recortar área (se especificado)&#13;
	IF stParametros.bRecortar THEN&#13;
		IF NOT RecortarArea(stParametros.nRecorteX, stParametros.nRecorteY, ...&#13;
							stParametros.nRecorteLargura, stParametros.nRecorteAltura) THEN&#13;
			RESULT False&#13;
		END&#13;
	END&#13;
	&#13;
	RESULT True&#13;
	&#13;
END&#13;
&#13;
//==============================================================================&#13;
// Método: SalvarImagem&#13;
// Descrição: Salva a imagem processada&#13;
// Parâmetros:&#13;
//   - sCaminhoDestino: Caminho onde salvar a imagem&#13;
//   - nQualidade: Qualidade da imagem (1-100, padrão: 95)&#13;
// Retorno: True se sucesso&#13;
//==============================================================================&#13;
PROCEDURE PUBLIC SalvarImagem(LOCAL sCaminhoDestino is string, LOCAL nQualidade is int = 95): boolean&#13;
&#13;
	IF NOT m_bImagemCarregada THEN&#13;
		m_sUltimoErro = "Nenhuma imagem carregada"&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	IF sCaminhoDestino = "" THEN&#13;
		m_sUltimoErro = "Caminho de destino não informado"&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	// Valida qualidade&#13;
	nQualidade = Max(1, Min(100, nQualidade))&#13;
	&#13;
	// Salva a imagem&#13;
	IF NOT dSaveImageJPEG(m_imgProcessada, sCaminhoDestino, nQualidade) THEN&#13;
		m_sUltimoErro = StringBuild("Erro ao salvar imagem: %1", ErrorInfo())&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	m_sUltimoErro = ""&#13;
	RESULT True&#13;
	&#13;
END&#13;
&#13;
//==============================================================================&#13;
// Método: ObterImagem&#13;
// Descrição: Retorna o objeto Image processado&#13;
// Retorno: Objeto Image&#13;
//==============================================================================&#13;
PROCEDURE PUBLIC ObterImagem(): Image&#13;
&#13;
	RESULT m_imgProcessada&#13;
	&#13;
END&#13;
&#13;
//==============================================================================&#13;
// Método: ExibirEmControle&#13;
// Descrição: Exibe a imagem processada em um controle Image&#13;
// Parâmetros:&#13;
//   - ctrlImagem: Controle Image onde exibir&#13;
// Retorno: True se sucesso&#13;
//==============================================================================&#13;
PROCEDURE PUBLIC ExibirEmControle(ctrlImagem is Control): boolean&#13;
&#13;
	IF NOT m_bImagemCarregada THEN&#13;
		m_sUltimoErro = "Nenhuma imagem carregada"&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	IF ctrlImagem..Type &lt;&gt; typImage THEN&#13;
		m_sUltimoErro = "Controle informado não é do tipo Image"&#13;
		RESULT False&#13;
	END&#13;
	&#13;
	ctrlImagem = m_imgProcessada&#13;
	&#13;
	RESULT True&#13;
	&#13;
END&#13;
&#13;
//==============================================================================&#13;
// ESTRUTURA DE PARÂMETROS&#13;
//==============================================================================&#13;
STParametrosDeblur is Structure&#13;
	// Correção de esticamento&#13;
	bCorrigirEsticamento is boolean = False&#13;
	bDirecaoHorizontal is boolean = True&#13;
	&#13;
	// Motion Deblur&#13;
	nDeslocamento is int = 0&#13;
	nAngulo is int = 0&#13;
	rSNR is real = 100.0&#13;
	&#13;
	// Ajustes de imagem&#13;
	nBrilho is int = 0&#13;
	nContraste is int = 50&#13;
	&#13;
	// Recorte&#13;
	bRecortar is boolean = False&#13;
	nRecorteX is int = 0&#13;
	nRecorteY is int = 0&#13;
	nRecorteLargura is int = 0&#13;
	nRecorteAltura is int = 0&#13;
END&#13;
```&#13;
&#13;
**Exemplo de uso da classe:**&#13;
&#13;
```wlanguage&#13;
//==============================================================================&#13;
// EXEMPLO DE USO - Processamento Forense de Placa de Carro&#13;
//==============================================================================&#13;
&#13;
PROCEDURE ExemploProcessamentoForense()&#13;
&#13;
	LOCAL objDeblur is CMotionDeblur&#13;
	LOCAL stParams is STParametrosDeblur&#13;
	&#13;
	// Cria instância da classe&#13;
	objDeblur = new CMotionDeblur()&#13;
	&#13;
	// Carrega imagem do carro com placa borrada&#13;
	IF NOT objDeblur.CarregarImagem("C:\Fotos\carro_borrado.jpg") THEN&#13;
		Error("Erro ao carregar imagem: " + objDeblur.UltimoErro)&#13;
		RETURN&#13;
	END&#13;
	&#13;
	Info(StringBuild("Imagem carregada: %1 x %2 pixels", ...&#13;
		objDeblur.LarguraImagem, objDeblur.AlturaImagem))&#13;
	&#13;
	// Mede a linha do blur na placa&#13;
	// Exemplo: linha traçada do ponto (320, 245) até (380, 250)&#13;
	objDeblur.MedirLinhaBlur(320, 245, 380, 250)&#13;
	&#13;
	Info(StringBuild("Blur medido: %1 pixels, ângulo: %2°", ...&#13;
		objDeblur.Deslocamento, objDeblur.AnguloBlur))&#13;
	&#13;
	// Configura parâmetros para processamento completo&#13;
	stParams.bCorrigirEsticamento = False  // Sem esticamento neste caso&#13;
	stParams.nDeslocamento = 0  // Usa medição automática&#13;
	stParams.nAngulo = 0  // Usa medição automática&#13;
	stParams.rSNR = 100.0&#13;
	stParams.nBrilho = -20  // Escurece fundo&#13;
	stParams.nContraste = 70  // Aumenta contraste&#13;
	stParams.bRecortar = True&#13;
	stParams.nRecorteX = 300&#13;
	stParams.nRecorteY = 230&#13;
	stParams.nRecorteLargura = 120&#13;
	stParams.nRecorteAltura = 40&#13;
	&#13;
	// Executa processamento completo&#13;
	IF NOT objDeblur.ProcessamentoCompleto(stParams) THEN&#13;
		Error("Erro no processamento: " + objDeblur.UltimoErro)&#13;
		RETURN&#13;
	END&#13;
	&#13;
	// Exibe resultado em controle de imagem&#13;
	objDeblur.ExibirEmControle(IMG_Resultado)&#13;
	&#13;
	// Salva imagem processada&#13;
	IF objDeblur.SalvarImagem("C:\Fotos\placa_nitida.jpg", 95) THEN&#13;
		Info("Imagem processada salva com sucesso!")&#13;
	ELSE&#13;
		Error("Erro ao salvar: " + objDeblur.UltimoErro)&#13;
	END&#13;
	&#13;
	// Libera objeto&#13;
	delete objDeblur&#13;
	&#13;
END&#13;
&#13;
//==============================================================================&#13;
// EXEMPLO 2 - Processamento Manual Passo a Passo&#13;
//==============================================================================&#13;
&#13;
PROCEDURE ExemploProcessamentoManual()&#13;
&#13;
	LOCAL objDeblur is CMotionDeblur&#13;
	&#13;
	objDeblur = new CMotionDeblur()&#13;
	&#13;
	// 1. Carrega imagem&#13;
	IF NOT objDeblur.CarregarImagem("C:\Fotos\placa_borrada.jpg") THEN&#13;
		Error(objDeblur.UltimoErro)&#13;
		RETURN&#13;
	END&#13;
	&#13;
	// 2. Mede esticamento (se objeto circular visível)&#13;
	// Exemplo: diâmetro horizontal = 150px, vertical = 100px&#13;
	LOCAL rFator is real = objDeblur.MedirEsticamento(150, 100)&#13;
	Info("Fator de esticamento: " + rFator)&#13;
	&#13;
	// 3. Corrige esticamento&#13;
	objDeblur.CorrigirEsticamento(True)  // Corrige horizontalmente&#13;
	&#13;
	// 4. Mede linha do blur&#13;
	objDeblur.MedirLinhaBlur(100, 50, 150, 55)&#13;
	&#13;
	// 5. Aplica deblur&#13;
	objDeblur.AplicarMotionDeblur()  // Usa medições automáticas&#13;
	&#13;
	// 6. Ajusta brilho e contraste&#13;
	objDeblur.AjustarBrilhoContraste(-15, 60)&#13;
	&#13;
	// 7. Recorta área de interesse&#13;
	objDeblur.RecortarArea(80, 40, 100, 30)&#13;
	&#13;
	// 8. Exibe e salva&#13;
	objDeblur.ExibirEmControle(IMG_Processada)&#13;
	objDeblur.SalvarImagem("C:\Fotos\resultado_final.jpg")&#13;
	&#13;
	delete objDeblur&#13;
	&#13;
END&#13;
```&#13;
&#13;
**Características da classe:**&#13;
&#13;
1. **Encapsulamento completo** - Todos os membros privados com propriedades de leitura&#13;
1. **Tratamento de erros** - Propriedade `UltimoErro` para diagnóstico&#13;
1. **Fluxo completo ou manual** - Método `ProcessamentoCompleto()` ou métodos individuais&#13;
1. **Validações rigorosas** - Todos os parâmetros são validados&#13;
1. **Compatibilidade WX** - Usa funções nativas: `dLoadImage`, `dSharpen`, `dModifyLuminosity`, etc.&#13;
1. **Estrutura de parâmetros** - `STParametrosDeblur` para configuração organizada&#13;
&#13;
**Limitações técnicas:**&#13;
&#13;
O WLanguage **não possui** implementação nativa de algoritmos complexos como Motion Deblur (Wiener deconvolution). A classe usa **aproximações** com filtros disponíveis (`dSharpen`, `dRotation`). Para resultados profissionais similares ao ImageJ, seria necessário integrar com DLLs externas ou usar APIs de processamento de imagem.&#13;
&#13;
&#13;
Mas nada impede usar python e outras linguagens como complementar para atingir esse objetivo.&#13;
&#13;
--&#13;
Adriano José Boller&#13;
______________________________________________&#13;
Consultor e Representante Oficial da&#13;
PcSoft no Brasil&#13;
+55 (41) 99949 1800&#13;
adrianoboller@gmail.com&#13;
skype: adrianoboller&#13;
http://wxinformatica.com.br/</description><ttl>30</ttl><generator>WEBDEV</generator><language>pt_BR</language><link>https://forum.pcsoft.fr/fr-FR/pcsoft.br.windev/5354-classe-para-processamento-forense-imagens-com-correcao-motion/read.awp</link><title>Classe para processamento forense de imagens com correção de  //            Motion Blur (desfoque de movimento)</title><managingEditor>moderateur@pcsoft.fr (Le modérateur)</managingEditor><webMaster>webmaster@pcsoft.fr (Le Webmaster)</webMaster></channel></rss>
