PictureViewer - Bildgröße ändern
anno2007
- php
Hallo,
ich bin gerade dabei mir einen PictureViewer zu programmieren (Den Name habe ich mir selbst ausgedacht, also keine fertige Software).
Doch jetzt bin ich an einem Punkt angelangt, wo ich keine Ahnung mehr habe: Ich möchte, wenn ein User über den PictUploader ein Bild hoch läd, dass das PictUploader-Script dann die Bildgröße auf einen festen Wert setzt (z.B. vorher 1024x768 => 800x600). Es sollte auch nach möglichkeit die Propotionen der Bildgröße beibehalten, wäre aber nicht so wichtig. Wichtiger ist 1024x768 => 800x600.
Gruß
anno2007
Hallo,
ich habe das Problem selbst gelöst.
Gruß
anno2007
Hallo,
ich habe das Problem selbst gelöst.
Gruß
anno2007
versuch doch mal folgende Klasse:
<?php
class ImageResizer {
var $imageFile;
var $filetype;
var $quality;
var $size;
var $newSize;
function ImageResizer() {
// constructor
// @param void
// @return void
$this->imageFile = "";
$this->filetype = 0;
$this->quality = 70;
$this->size = "";
$this->newSize = "";
return;
}
function setImageFile($ifile = "") {
// sets the image filename
// @param string $ifile
// @return bool success
if(!file_exists($ifile)) {
die("Image doesn't exist.");
return false;
}
$size = @getimagesize($ifile);
if(!is_array($size)) {
die("Image isn't a valid image.");
return false;
}
$this->imageFile = $ifile;
$this->size = $size;
$this->filetype = $size[2];
return true;
}
function setJpgQuality($quality = 70) {
// sets the jpg quality percentage
// @param int unsigned [0-100] $quality
// @return bool success
if($quality < 0 or $quality > 100) {
die("Wrong JPG quality given (must be 0 < x < 100).");
return false;
}
$this->quality = $quality;
return true;
}
function setNewSize($params) {
// sets the new size of the image
// @param $params = array(V);
// int unsigned $width
// int unsigned $height
// int unsigned $larger
// int unsigned $smaller
// bool $proportional, default value true
// bool $percent, default value false
// @return bool success
// unpack params
$proportional = ( isset($params['proportional'])
and is_bool($params['proportional']))
? $params['proportional']
: true;
$percent = (isset($params['percent'])
and is_bool($params['percent']))
? $params['percent']
: false;
$stretchSmall = (isset($params['stretchSmall'])
and is_bool($params['stretchSmall']))
? $params['stretchSmall']
: false;
$landscape = $this->size[0] > $this->size[1]
? true
: false;
$width = isset($params['width'])
? $params['width']
: 0;
$height = isset($params['height'])
? $params['height']
: 0;
$larger = isset($params['larger'])
? $params['larger']
: 0;
$smaller = isset($params['smaller'])
? $params['smaller']
: 0;
if($landscape) {
$width = $larger;
$height = $smaller;
}
else {
$width = $smaller;
$height = $larger;
}
if($proportional) {
if($width > 0 and $height == 0) {
$height = $width * ($this->size[1] / $this->size[0]);
}
elseif($width == 0 and $height > 0) {
$width = $height * ($this->size[0] / $this->size[1]);
}
}
if($percent) {
$width = $this->size[0] * ($width / 100);
$height = $this->size[1] * ($height / 100);
}
if(!$stretchSmall) {
if($width > $this->size[0] or $height > $this->size[1]) {
$width = $this->size[0];
$height = $this->size[1];
}
}
$this->newSize = array($width, $height);
return true;
}
function createResizedImage($filename = "") {
$img1 = "";
switch($this->filetype) {
case 1:
$img1 = imagecreatefromgif($this->imageFile);
break;
case 2:
$img1 = imagecreatefromjpeg($this->imageFile);
break;
case 3:
$img1 = imagecreatefrompng($this->imageFile);
break;
default:
return false;
}
$img2 = imagecreate($this->newSize[0], $this->newSize[1]);
$randomString = substr(md5(uniqid(rand())), 0, 8);
$tmp = DIR_TEMP . "_" . $randomString . ".jpg";
imagejpeg($img2, $tmp, 100);
imagedestroy($img2);
$img2 = imagecreatefromjpeg($tmp);
unlink($tmp);
imagecopyresized($img2, $img1, 0, 0, 0, 0,
$this->newSize[0], $this->newSize[1],
$this->size[0], $this->size[1]);
if($filename != "") {
imagejpeg($img2, $filename, $this->quality);
}
else {
header("Content-Type:image/jpeg");
imagejpeg($img2, "", $this->quality);
}
imagedestroy($img1);
imagedestroy($img2);
return true;
}
}
// zu benutzen wie folgt:
define("MAX_IMAGE_SIZE", 800);
$ir = new ImageResizer();
$ir->setImageFile($filename); $ir->setNewSize(array("larger"=>MAX_IMAGE_SIZE)); $ir->createResizedImage($newFilename);
// durch "larger"=>MAX_IMAGE_SIZE wird die größere Seite des Bildes auf den Wert geschrumpft, die kleinere entsprechend = proportional.
// auch möglich: "smaller"=>MAX_IMAGE_SIZE
// schau dir die Funktion setNewSize() in der Klasse an, da findest du eine komplette Param-Liste.
// wenn du statt createResizedImage($newFilename); schreibst:
// createResizedImage(); also ohne Parameter wird das Bild an den Browser gesendet.
?>