کمک:مشکل بسیار حاد با ریسایز کردن عکس مطالب

amin100amin

Member
با سلام خدمت اساتید گرامی
من یه مشکل دارم با ریسایز کردن عکس های مطالبی که آپلود میکنم. قبل از هرچیز فایل ایمیج که عمل ریسایز رو انجام میده رو اینجا میزارم
PHP:
<?php
final class Image {
    private $file;
    private $image;
    private $info;
		
	public function __construct($file) {
		if (file_exists($file)) {
			$this->file = $file;

			$info = getimagesize($file);

			$this->info = array(
            	'width'  => $info[0],
            	'height' => $info[1],
            	'bits'   => $info['bits'],
            	'mime'   => $info['mime']
        	);
        	
        	$this->image = $this->create($file);
    	} else {
      		exit('Error: Could not load image ' . $file . '!');
    	}
	}
		
	private function create($image) {
		$mime = $this->info['mime'];
		
		if ($mime == 'image/gif') {
			return imagecreatefromgif($image);
		} elseif ($mime == 'image/png') {
			return imagecreatefrompng($image);
		} elseif ($mime == 'image/jpeg') {
			return imagecreatefromjpeg($image);
		}
    }	
	
    public function save($file, $quality = 100) {
        $info = pathinfo($file);
        $extension = $info['extension'];
   
        if ($extension == ('jpeg' || 'jpg')) {
            imagejpeg($this->image, $file, $quality);
        } elseif($extension == 'png') {
            imagepng($this->image, $file, 0);
        } elseif($extension == 'gif') {
            imagegif($this->image, $file);
        }
		   
	    imagedestroy($this->image);
    }	    
	
    public function resize($width = 0, $height = 0) {
       if (!$this->info['width'] || !$this->info['height']) {
         return;
      }

      $xpos = 0;
      $ypos = 0;

      $scale = min($width / $this->info['width'], $height / $this->info['height']);
      
      if ($scale == 1) {
         return;
      }
      
      $new_width = (int)($this->info['width'] * $scale);
      $new_height = (int)($this->info['height'] * $scale);         
      $xpos = (int)(($width - $new_width) / 2);
      $ypos = (int)(($height - $new_height) / 2);

      $image_old = $this->image;
      $this->image = imagecreatetruecolor($new_width, $new_height);
      
      $background = imagecolorallocate($this->image, 255, 255, 255);
      //imagefilledrectangle($this->image, 0, 0, $width, $height, $background);
   
      imagecopyresized($this->image, $image_old, 0, 0, 0, 0, $new_width, $new_height, $this->info['width'], $this->info['height']);
      imagedestroy($image_old);

      $this->info['width']  = $new_width;
      $this->info['height'] = $new_height;
    }
    
    public function watermark($file, $position = 'bottomright') {
        $watermark = $this->create($file);
        
        $watermark_width = imagesx($watermark);
        $watermark_height = imagesy($watermark);
        
        switch($position) {
            case 'topleft':
                $watermark_pos_x = 0;
                $watermark_pos_y = 0;
                break;
            case 'topright':
                $watermark_pos_x = $this->info['width'] - $watermark_width;
                $watermark_pos_y = 0;
                break;
            case 'bottomleft':
                $watermark_pos_x = 0;
                $watermark_pos_y = $this->info['height'] - $watermark_height;
                break;
            case 'bottomright':
                $watermark_pos_x = $this->info['width'] - $watermark_width;
                $watermark_pos_y = $this->info['height'] - $watermark_height;
                break;
        }
        
        imagecopy($this->image, $watermark, $watermark_pos_x, $watermark_pos_y, 0, 0, 120, 40);
        
        imagedestroy($watermark);
    }
    
    public function crop($top_x, $top_y, $bottom_x, $bottom_y) {
        $image_old = $this->image;
        $this->image = imagecreatetruecolor($bottom_x - $top_x, $bottom_y - $top_y);
        
        imagecopy($this->image, $image_old, 0, 0, $top_x, $top_y, $this->info['width'], $this->info['height']);
        imagedestroy($image_old);
        
        $this->info['width'] = $bottom_x - $top_x;
        $this->info['height'] = $bottom_y - $top_y;
    }
    
    public function rotate($degree, $color = 'FFFFFF') {
		$rgb = $this->html2rgb($color);
		
        $this->image = imagerotate($this->image, $degree, imagecolorallocate($this->image, $rgb[0], $rgb[1], $rgb[2]));
        
		$this->info['width'] = imagesx($this->image);
		$this->info['height'] = imagesy($this->image);
    }
	    
    private function filter($filter) {
        imagefilter($this->image, $filter);
    }
            
    private function text($text, $x = 0, $y = 0, $size = 5, $color = '000000') {
		$rgb = $this->html2rgb($color);
        
		imagestring($this->image, $size, $x, $y, $text, imagecolorallocate($this->image, $rgb[0], $rgb[1], $rgb[2]));
    }
    
    private function merge($file, $x = 0, $y = 0, $opacity = 100) {
        $merge = $this->create($file);

        $merge_width = imagesx($image);
        $merge_height = imagesy($image);
		        
        imagecopymerge($this->image, $merge, $x, $y, 0, 0, $merge_width, $merge_height, $opacity);
    }
			
	private function html2rgb($color) {
		if ($color[0] == '#') {
			$color = substr($color, 1);
		}
		
		if (strlen($color) == 6) {
			list($r, $g, $b) = array($color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5]);   
		} elseif (strlen($color) == 3) {
			list($r, $g, $b) = array($color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2]);    
		} else {
			return FALSE;
		}
		
		$r = hexdec($r); 
		$g = hexdec($g); 
		$b = hexdec($b);    
		
		return array($r, $g, $b);
	}	
}
?>

به طور خلاصه این فایل اون طور که میخوایم کار نمیکنه. یعنی اگر یه عکس با سایز بزرگ رو بدیم وقتی عکس کوچک از اون میسازه یک عکس بی کیفیت و در عین حال با حجم بسیار بالا(مثلا یه عکس 100 در 150 پیکسل 25 کیلوبایت حجمشه) هست و اصلن به درد نمیخوره. راهی هست که بشه این کار رو اصلاح کرد ؟

با تشکر:rose:
 

P.H.P

Member
سلام

کیفیت رو برای فایل jpg فقط تعریف کردی

این تابع رو جایگزین کن و چک کن

PHP:
    public function save($file, $quality = 100) {
        $info = pathinfo($file);
        $extension = $info['extension'];
   
        if ($extension == ('jpeg' || 'jpg')) {
            imagejpeg($this->image, $file, $quality);
        } elseif($extension == 'png') {
            imagepng($this->image, $file, $quality);
        } elseif($extension == 'gif') {
            imagegif($this->image, $file, $quality);
        }
           
        imagedestroy($this->image);
    }

در ضمن کیفیت 70 باشه کافیه. 100 کیفیت اصلی تصویر میشه

موفق
 

amin100amin

Member
سلام
ممنون از پاسختون. اما فقط با عکس های jpg کار میکنیم و بقیه فرمت ها زیاد مهم نیستن. کیفیت 70 عکس رو پیکسل پیکسل میکنه. به نظر شما راهی نیست که با کیفیت 85 بالاترین کیفیت عکس رو در عین حال با کمترین حجم فایل داشت ؟
 

amin100amin

Member
در ضمن فایل های png و gif چیزی به نام کیفیت ندارن. اونها تعداد رنگ دارن که با این فرق میکنه
 

MJmoonwalk

Member
تغییر سایز تصویر توسط php با تغییر سایز در فوتوشاپ بسیار فرق داره! گمون نکنم راهی برای این کار باشه مگه اینکه از برنامه های جداگونه استفاده کنید یعنی برنامه ای رو سرور نصب کنید و درخواست به برنامه داده بشه و عکس دریافت بشه!
کیفیت هم تنها فقط برای jpg کارایی داره.
 

جدیدترین ارسال ها

بالا