Pular para o conteúdo
PHP

PHP — Corrigindo rotação de imagens tiradas via Celular

Atualizado em
Capa do artigo: PHP — Corrigindo rotação de imagens tiradas via Celular

Olá Gente!

Vocês já devem ter tido um problema curioso, quando uma foto que foi tirada via celular é upada ela fica rotacionada (em alguns casos).

Isto ocorre porque o celular é virado, o que faz a imagem ser salva virada.

Quando isto ocorre, uma informação “Orientation” é armazenada nos meta dados da imagem.

Isto nos permite corrigir a rotação muito facilmente, para isto, iremos utilizar o “exif_read_data” para ler os dados da imagem, e o “imageflip” para rotacionar.

Para facilitar, temos uma função que já corrigi logo no Upload:

<?
function ImageFixOrientation_PrepImageUpload($FILE)
{

	if( file_exists($FILE["tmp_name"]) )
	{
	
		$TmpDs["Extencao"]			= explode(".", $FILE["name"]);
		$TmpDs["Extencao"]			= array_reverse($TmpDs["Extencao"]);
		$TmpDs["Extencao"]			= $TmpDs["Extencao"][0];
		$TmpDs["Extencao"]			= strtolower($TmpDs["Extencao"]);
		
		if( $TmpDs["Extencao"] == "jpg" )
		{
			
			ImageFixOrientation_JPG($FILE["tmp_name"]);
			
			$FILE["tmp_name"]			= $FILE["tmp_name"];
			$FILE["name"]				= $FILE["name"];
			$FILE["type"]				= "image/jpeg";
		
		}
		
	}
	
	return $FILE;

}

function ImageFixOrientation_JPG($filename)
{

	$exif = exif_read_data($filename);

	if (!empty($exif['Orientation']))
	{
	
		$image = imagecreatefromjpeg($filename);
		
		switch ($exif['Orientation'])
		{
			case 1: // nothing
				break;
			case 2: // horizontal flip
				imageflip($image, IMG_FLIP_HORIZONTAL);
				break;
			case 3: // 180 rotate left
				$image = imagerotate($image, 180, 0);
				break;
			case 4: // vertical flip
				imageflip($image, IMG_FLIP_VERTICAL);
				break;
			case 5: // vertical flip + 90 rotate right
				imageflip($image, IMG_FLIP_VERTICAL);
				$image = imagerotate($image, -90, 0);
				break;
			case 6: // 90 rotate right
				$image = imagerotate($image, -90, 0);
				break;
			case 7: // horizontal flip + 90 rotate right
				imageflip($image, IMG_FLIP_HORIZONTAL);
				$image = imagerotate($image, -90, 0);
				break;
			case 8:    // 90 rotate left
				$image = imagerotate($image, 90, 0);
				break;
		}

		imagejpeg($image, $filename, 100);
		
	}
	
}

Bastando chamarmos a função “ImageFixOrientation_PrepImageUpload” indicando uma imagem enviada:

<? 
ImageFixOrientation_PrepImageUpload($_FILE["MinhaImagem"]);

Simples e resolve um probleminha chato logo no Upload.

É hora de dar tchau, pessoal! 👩‍💻

Até breve! 👋

PHP

Leia também