Desaturacja w PHP

Ostatnio miałem takie małe zadanko, którego celem było wyszarzenie ikony, gdy zajdzie jakieś zdarzenie. Oczywiście nie interesowało mnie, utworzenie ręcznie szarego odpowiednika dla kolorowej ikony i wyświetlanie go gdy zajdzie taka potrzeba, dlatego poszukałem czy istnieje coś takiego w PHP,a że chwilę poświęciłem na znalezienie tego, to zanotuje tutaj ;)

Jak się okazało po chwili nieudolnych poszukiwań (uleciała mnie nazwa desaturacja, dlatego pewnie tak długo to trwało) znalazłem funkcje w php, która zrobi wszystko co mnie interesuje za „free” i nie potrzeba będzie jakiś dodatkowych libów.

Funkcja, o której mowa to

bool imagecopymergegray ( resource $dst_im , resource $src_im ,
					int $dst_x , int $dst_y , int $src_x , int $src_y ,
					int $src_w , int$src_h , int $pct )

mnogość parametrów i mnie zabija do teraz, ale po kolei
$dst_im – zasób do którego zapisany zostanie wynik działania funkcji
$src_im – zasób w którym znajduje się kolorowe zdjęcie
$dst_x – punkt x w zasobie docelowym, od którego zaczniemy wypełniać zasób
$dst_y – punkt y w zasobie docelowym, od którego zaczniemy wypełniać zasób
$src_x – punkt x w zasobie źródłowym, od którego zaczniemy pobierać punkty do przetworzenia
$src_y – punkt y w zasobie źródłowym, od którego zaczniemy pobierać punkty do przetworzenia
$src_w – szerokość zasobu (fragmentu, jaki chcemy przetworzyć)
$src_h – wysokość zasobu (fragmentu, jaki chcemy przetworzyć)
$pct – skala szarości, przez jaką „przepuścimy” źródłowy zasób, przy czym 0 to pełna skala szarości, a 100 to zerowa skala szarości (zasób pozostanie niezmieniony)
funkcja na wyjściu zwraca true/false w zależności od tego czy się udało przetworzyć zasób

I teraz już wszystko jest jasne

Na koniec mały bonus, moja klaska, którą napisałem i wykorzystuje do przetwarzania obrazków w aplikacjach PHP

class Image {
	private $image = null;
	private $imageType = null;
	private $imageTypeExtension;

	public function __construct($filename = null) {
		if($filename == null || !file_exists($filename))
			throw new Exception('File not exists');
		$this->load($filename);
	}

	public function load($filename) {
		$imageInfo = getimagesize($filename);
		$this->imageType = $imageInfo[2];
		if($this->imageType == IMAGETYPE_JPEG) {
			$this->image = imagecreatefromjpeg($filename);
			$this->imageTypeExtension = 'jpg';
		} elseif($this->imageType == IMAGETYPE_GIF) {
			$this->image = imagecreatefromgif($filename);
			$this->imageTypeExtension = 'gif';
		} elseif($this->imageType == IMAGETYPE_PNG) {
			$this->image = imagecreatefrompng($filename);
			$this->imageTypeExtension = 'png';
		} else {
			throw new Exception('Unsupported image type, only jpg, png, gif');
		}
		if($this->image === false) {
			throw new Exception('Unsupported image type, only jpg, png, gif');
		}
	}

	public function save($filename, $imageType = IMAGETYPE_JPEG, $compression = 80, $permissions = null) {
		$result = false;
		if($this->image == null)
			throw new Exception('Image error');
		if($imageType == IMAGETYPE_JPEG) {
			$result = imagejpeg($this->image, $filename, $compression);
		} elseif($imageType == IMAGETYPE_GIF) {
			$result = imagegif($this->image, $filename);
		} elseif($imageType == IMAGETYPE_PNG) {
			$result = imagepng($this->image, $filename);
		}
		if($permissions != null) {
			chmod($filename, $permissions);
		}
		return $result;
	}

	public function getWidth() {
		if($this->image == null)
			throw new Exception('Image error');
		return imagesx($this->image);
	}

	public function getHeight() {
		if($this->image == null)
			throw new Exception('Image error');
		return imagesy($this->image);
	}

	public function resizeToHeight($height) {
		$ratio = $height / $this->getHeight();
		$width = $this->getWidth() * $ratio;
		$this->resize($width, $height);
	}

	public function resizeToWidth($width) {
		$ratio = $width / $this->getWidth();
		$height = $this->getHeight() * $ratio;
		$this->resize($width, $height);
	}

	public function scale($scale) {
		$width = $this->getWidth() * $scale / 100;
		$height = $this->getHeight() * $scale / 100;
		$this->resize($width, $height);
	}

	public function resize($width, $height) {
		if($this->image == null)
			throw new Exception('Image error');
		$newImage = imagecreatetruecolor($width, $height);
		imagecopyresampled($newImage, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
		$this->image = $newImage;
	}

	public function getType() {
		if($this->image == null)
			throw new Exception('Image error');
		return $this->imageType;
	}

	public function getTypeExtension() {
		if($this->image == null)
			throw new Exception('Image error');
		return $this->imageTypeExtension;
	}

	public function setGrey($grey = 0) {
		return imagecopymergegray($this->image, $this->image, 0, 0, 0, 0, $this->getWidth(), $this->getHeight(), $grey);
	}
}

I sposób wykorzystania dla dzisiejszego przykładu

$img = new Image('kolorowy_obrazek.jpg');
$img->setGrey();
$img->save('szary_obrazek.jpg');

Tagi: , , , , ,

19 października 2012 | PHP

Zostaw odpowiedź