/** * 获取图片mime */ public function getMimeType() { return MagickGetImageMimeType(self::$resource); }
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; }