Beispiel #1
0
 /**
  * 获取图片mime
  */
 public function getMimeType()
 {
     return MagickGetImageMimeType(self::$resource);
 }
Beispiel #2
0
 public function test($filepath, $original_filename = "")
 {
     switch ($this->backend) {
         case LIBRARY_GD:
             $va_info = getimagesize($filepath);
             if ($va_info[2] > 0) {
                 return image_type_to_mime_type($va_info[2]);
             }
             break;
         default:
             // Try to detect PDF file by header; if we pass a PDF to MagickPingImage()
             // it can crash Apache (on some Linux boxes, at least)
             if ($r_fp = fopen($filepath, "r")) {
                 $vs_header = fread($r_fp, 4);
                 if ($vs_header == "%PDF") {
                     return false;
                 }
                 fclose($r_fp);
             } else {
                 return false;
             }
             $r_handle = NewMagickWand();
             if (MagickPingImage($r_handle, $filepath)) {
                 if ($mimetype = MagickGetImageMimeType($r_handle)) {
                     return $mimetype;
                 }
             }
             break;
     }
     return false;
 }
/**
 * liberty_magickwand_resize_image 
 * 
 * @param array $pFileHash 
 * @access public
 * @return TRUE on success, FALSE on failure - mErrors will contain reason for failure
 */
function liberty_magickwand_resize_image(&$pFileHash)
{
    global $gBitSystem;
    // static var here is crucial
    static $rgbConverts = array();
    $magickWand = NewMagickWand();
    $pFileHash['error'] = NULL;
    $ret = NULL;
    if (!empty($pFileHash['source_file']) && is_file($pFileHash['source_file']) && filesize($pFileHash['source_file'])) {
        if ($error = liberty_magickwand_check_error(MagickReadImage($magickWand, $pFileHash['source_file']), $magickWand)) {
            // $pFileHash['error'] = $error;
            $destFile = liberty_process_generic($pFileHash, FALSE);
        } else {
            if (MagickGetImageColorspace($magickWand) == MW_CMYKColorspace) {
                //				These two lines are a hack needed for version of Ghostscript less that 8.60
                MagickRemoveImageProfile($magickWand, "ICC");
                MagickSetImageProfile($magickWand, 'ICC', file_get_contents(UTIL_PKG_PATH . 'icc/USWebCoatedSWOP.icc'));
                MagickProfileImage($magickWand, 'ICC', file_get_contents(UTIL_PKG_PATH . 'icc/srgb.icm'));
                MagickSetImageColorspace($magickWand, MW_RGBColorspace);
                $pFileHash['colorspace_conversion'] = TRUE;
            }
            MagickSetImageCompressionQuality($magickWand, $gBitSystem->getConfig('liberty_thumbnail_quality', 85));
            $iwidth = round(MagickGetImageWidth($magickWand));
            $iheight = round(MagickGetImageHeight($magickWand));
            // this does not seem to be needed. magickwand will work out what to do by using the destination file extension
            //MagickSetImageFormat( $magickWand, $format );
            if (empty($pFileHash['max_width']) && empty($pFileHash['max_height']) || !empty($pFileHash['max_width']) && $pFileHash['max_width'] == MAX_THUMBNAIL_DIMENSION || !empty($pFileHash['max_height']) && $pFileHash['max_height'] == MAX_THUMBNAIL_DIMENSION) {
                $pFileHash['max_width'] = $iwidth;
                $pFileHash['max_height'] = $iheight;
            } elseif ($iheight && $iwidth / $iheight < 1 && !empty($pFileHash['max_width']) && !empty($pFileHash['max_height'])) {
                // we have a portrait image, flip everything
                $temp = $pFileHash['max_width'];
                $pFileHash['max_height'] = $pFileHash['max_width'];
                $pFileHash['max_width'] = round($iwidth / $iheight * $pFileHash['max_height']);
            } elseif (!empty($pFileHash['max_width'])) {
                $pFileHash['max_height'] = round($iheight / $iwidth * $pFileHash['max_width']);
            } elseif (!empty($pFileHash['max_height'])) {
                $pFileHash['max_width'] = round($iwidth / $iheight * $pFileHash['max_height']);
            }
            // Make sure not to scale up
            if ($pFileHash['max_width'] > $iwidth && $pFileHash['max_height'] > $iheight) {
                $pFileHash['max_width'] = $iwidth;
                $pFileHash['max_height'] = $iheight;
            }
            // override $mimeExt if we have a custom setting for it
            if ($gBitSystem->isFeatureActive('liberty_thumbnail_format')) {
                $mimeExt = $gBitSystem->getConfig('liberty_thumbnail_format');
            } elseif ($itype = MagickGetImageMimeType($magickWand)) {
                list($type, $mimeExt) = preg_split('#/#', strtolower($itype));
            } else {
                list($type, $mimeExt) = preg_split('#/#', strtolower($pFileHash['type']));
            }
            $replaced = FALSE;
            $mimeExt = preg_replace("!^(x-)?(jpeg|png|gif)\$!", "\$2", $mimeExt, -1, $replaced);
            if ($replaced) {
                $targetType = $mimeExt;
                $destExt = '.' . $mimeExt;
            }
            if (empty($destExt) || $mimeExt == 'jpeg') {
                $targetType = 'jpeg';
                $destExt = '.jpg';
            }
            if (!empty($pFileHash['dest_file'])) {
                $destFile = $pFileHash['dest_file'];
            } else {
                $destFile = STORAGE_PKG_PATH . $pFileHash['dest_branch'] . $pFileHash['dest_base_name'] . $destExt;
            }
            if (!empty($pFileHash['max_width']) && !empty($pFileHash['max_height']) && ($pFileHash['max_width'] < $iwidth || $pFileHash['max_height'] < $iheight || $mimeExt != $targetType) || !empty($pFileHash['colorspace_conversion'])) {
                $pFileHash['name'] = $pFileHash['dest_base_name'] . $destExt;
                // Alternate Filter settings can seen here http://www.dylanbeattie.net/magick/filters/result.html
                if ($error = liberty_magickwand_check_error(MagickResizeImage($magickWand, $pFileHash['max_width'], $pFileHash['max_height'], MW_CatromFilter, 1.0), $magickWand)) {
                    $pFileHash['error'] .= $error;
                }
                if ($error = liberty_magickwand_check_error(MagickWriteImage($magickWand, $destFile), $magickWand)) {
                    $pFileHash['error'] .= $error;
                }
                $pFileHash['size'] = filesize($destFile);
            } else {
                copy($pFileHash['source_file'], $destFile);
            }
        }
        $ret = $destFile;
    } else {
        $pFileHash['error'] = "No source file to resize";
    }
    DestroyMagickWand($magickWand);
    return $ret;
}
 /**
  * This is a utility function for adding images to your system.  This can be used in 
  * a console application to pick up an image located at $fsPath and copy it to
  * your disk-based data store and create a record in the Images table.
  * 
  * @param string $fsPath The full path to the image you want to add to the system
  * @param string $filePath The relative path and file name that you want to use for the resulting Image 
  * @return string  An Image object.
  */
 public function createImageObjectFromFileSystemPath($fsPath, $filePath)
 {
     if (!file_exists($fsPath)) {
         throw new Exception("File {$fsPath} does not exist");
     }
     $magick_wand = NewMagickWand();
     MagickReadImage($magick_wand, $fsPath);
     //check the image type
     $mimeType = MagickGetImageMimeType($magick_wand);
     $typeStr = '';
     switch ($mimeType) {
         case 'image/png':
             $typeStr = 'PNG';
             break;
         case 'image/jpg':
         case 'image/jpeg':
             $typeStr = 'JPG';
             break;
         case 'image/gif':
             $typeStr = 'GIF';
             break;
         default:
             throw new Exception("Unknown image mime-type {$mimeType}");
             break;
     }
     //Ensure that $filePath is not the path of another Image already in the system.  If
     //it is a duplicate, append an interger to the file name to make it unique.
     $unique = false;
     //initialze the unique flag to false
     $parts = pathinfo($filePath);
     //get the path parts
     $baseName = "{$parts['dirname']}/{$parts['filename']}";
     //the full path minus file extension
     $ext = $parts['extension'];
     //the extention
     $ct = 0;
     //the integer we will append to the filename, if necessary
     $testFile = "{$baseName}.{$ext}";
     while (!$unique) {
         $existImg = Image::findByFilePath($testFile);
         //check the database to see if this path already exists
         if (!isset($existImg)) {
             $unique = true;
             //it doesn't exist.  $unique==true will break the while
         } else {
             $ct++;
             //it does exist - increment the counter, change the $testFile, then loop to test the file name
             $testFile = "{$baseName}{$ct}.{$ext}";
         }
     }
     $finalFilePath = $testFile;
     $this->ensureImagePath($finalFilePath);
     $fullImagePath = $this->imagesRoot . $finalFilePath;
     copy($fsPath, $fullImagePath);
     //copy the file to it's official location
     $img = new Image();
     //create new Image Object
     $img->FilePath = $finalFilePath;
     $img->ImageType = $typeStr;
     $img->Version = 1;
     $img->save();
     //commit to database
     return $img;
 }