Пример #1
0
 /**
  * Attempt to resize file if the filesize is too large after an initial resize to max dimensions or the file is already within max dimensions but the filesize is too large
  *
  * @param	bool	Has the image already been resized once?
  * @param	bool	Attempt a resize
  */
 function fetch_best_resize(&$jpegconvert, $resize = true)
 {
     if (!$jpegconvert and $this->upload['filesize'] > $this->maxuploadsize and $resize and $this->image->is_valid_resize_type($this->imginfo[2])) {
         // Linear Regression
         switch ($this->registry->options['thumbquality']) {
             case 65:
                 // No Sharpen
                 // $magicnumber = round(379.421 + .00348171 * $this->maxuploadsize);
                 // Sharpen
                 $magicnumber = round(277.652 + 0.00428902 * $this->maxuploadsize);
                 break;
             case 85:
                 // No Sharpen
                 // $magicnumber = round(292.53 + .0027378 * $this-maxuploadsize);
                 // Sharpen
                 $magicnumber = round(189.939 + 0.00352439 * $this->maxuploadsize);
                 break;
             case 95:
                 // No Sharpen
                 // $magicnumber = round(188.11 + .0022561 * $this->maxuploadsize);
                 // Sharpen
                 $magicnumber = round(159.146 + 0.00234146 * $this->maxuploadsize);
                 break;
             default:
                 //75
                 // No Sharpen
                 // $magicnumber = round(328.415 + .00323415 * $this->maxuploadsize);
                 // Sharpen
                 $magicnumber = round(228.201 + 0.00396951 * $this->maxuploadsize);
         }
         $xratio = $this->imginfo[0] > $magicnumber ? $magicnumber / $this->imginfo[0] : 1;
         $yratio = $this->imginfo[1] > $magicnumber ? $magicnumber / $this->imginfo[1] : 1;
         if ($xratio > $yratio and $xratio != 1) {
             $new_width = round($this->imginfo[0] * $xratio);
             $new_height = round($this->imginfo[1] * $xratio);
         } else {
             $new_width = round($this->imginfo[0] * $yratio);
             $new_height = round($this->imginfo[1] * $yratio);
         }
         if ($new_width == $this->imginfo[0] and $new_height == $this->imginfo[1]) {
             // subtract one pixel so that requested size isn't the same as the image size
             $new_width--;
             $forceresize = false;
         } else {
             $forceresize = true;
         }
         $this->upload['resized'] = $this->image->fetch_thumbnail($this->upload['filename'], $this->upload['location'], $new_width, $new_height, $this->registry->options['thumbquality'], false, false, true, false);
         if (empty($this->upload['resized']['filedata'])) {
             if ($this->image->is_valid_thumbnail_extension(file_extension($this->upload['filename'])) and !empty($this->upload['resized']['imageerror']) and $this->registry->userinfo['permissions']['adminpermissions'] & $this->registry->bf_ugp_adminpermissions['cancontrolpanel']) {
                 if (($error = $this->image->fetch_error()) !== false and $this->registry->userinfo['permissions']['adminpermissions'] & $this->registry->bf_ugp_adminpermissions['cancontrolpanel']) {
                     $this->set_error('image_resize_failed_x', htmlspecialchars_uni($error));
                     return false;
                 } else {
                     $this->set_error($this->upload['resized']['imageerror']);
                     return false;
                 }
             } else {
                 $this->set_error('upload_file_exceeds_forum_limit', vb_number_format($this->upload['filesize'], 1, true), vb_number_format($this->maxuploadsize, 1, true));
                 #$this->set_error('upload_exceeds_dimensions', $this->maxwidth, $this->maxheight, $this->imginfo[0], $this->imginfo[1]);
                 return false;
             }
         } else {
             $jpegconvert = true;
         }
     }
     if (!$jpegconvert and $this->upload['filesize'] > $this->maxuploadsize) {
         $this->set_error('upload_file_exceeds_forum_limit', vb_number_format($this->upload['filesize'], 1, true), vb_number_format($this->maxuploadsize, 1, true));
         return false;
     } else {
         if ($jpegconvert and $this->upload['resized']['filesize'] and ($this->upload['resized']['filesize'] > $this->maxuploadsize or $forceresize)) {
             $ratio = $this->maxuploadsize / $this->upload['resized']['filesize'];
             $newwidth = $this->upload['resized']['width'] * sqrt($ratio);
             $newheight = $this->upload['resized']['height'] * sqrt($ratio);
             if ($newwidth > $this->imginfo[0]) {
                 $newwidth = $this->imginfo[0] - 1;
             }
             if ($newheight > $this->imginfo[1]) {
                 $newheight = $this->imginfo[1] - 1;
             }
             $this->upload['resized'] = $this->image->fetch_thumbnail($this->upload['filename'], $this->upload['location'], $newwidth, $newheight, $this->registry->options['thumbquality'], false, false, true, false);
             if (empty($this->upload['resized']['filedata'])) {
                 if (!empty($this->upload['resized']['imageerror']) and $this->registry->userinfo['permissions']['adminpermissions'] & $this->registry->bf_ugp_adminpermissions['cancontrolpanel']) {
                     if (($error = $this->image->fetch_error()) !== false and $this->registry->userinfo['permissions']['adminpermissions'] & $this->registry->bf_ugp_adminpermissions['cancontrolpanel']) {
                         $this->set_error('image_resize_failed_x', htmlspecialchars_uni($error));
                         return false;
                     } else {
                         $this->set_error($this->upload['resized']['imageerror']);
                         return false;
                     }
                 } else {
                     $this->set_error('upload_file_exceeds_forum_limit', vb_number_format($this->upload['filesize'], 1, true), vb_number_format($this->maxuploadsize, 1, true));
                     #$this->set_error('upload_exceeds_dimensions', $this->maxwidth, $this->maxheight, $this->imginfo[0], $this->imginfo[1]);
                     return false;
                 }
             } else {
                 $jpegconvert = true;
             }
         }
     }
     return true;
 }