Language agnostic 按比例调整图像大小
我在将图像缩放到适当的预定义大小时遇到了一点问题。我想知道——因为这纯粹是数学,是否有某种通用的逻辑算法在每种语言(PHP、ActionScript、Javascript等)中都能按比例缩放图像 我现在正在使用这个:Language agnostic 按比例调整图像大小,language-agnostic,image-manipulation,Language Agnostic,Image Manipulation,我在将图像缩放到适当的预定义大小时遇到了一点问题。我想知道——因为这纯粹是数学,是否有某种通用的逻辑算法在每种语言(PHP、ActionScript、Javascript等)中都能按比例缩放图像 我现在正在使用这个: var maxHeight = 300; var maxWidth = 300; var ratio:Number = height / width; if (height > maxHeight) { height = maxHeight;
var maxHeight = 300;
var maxWidth = 300;
var ratio:Number = height / width;
if (height > maxHeight) {
height = maxHeight;
width = Math.round(height / ratio);
}
else if(width > maxWidth) {
width = maxWidth;
height = Math.round(width * ratio);
}
但它不能正常工作。当然,图像按比例缩放,但大小没有设置为300(宽度或高度)。这有点道理,但我想知道是否有一种简单易行的方法可以按比例缩放图像。我建议不要自己编写这段代码;有无数像素级的细节需要花很长时间才能正确处理。使用ImageMagick,它是最好的图形库
ratio = MIN( maxWidth / width, maxHeight/ height );
width = ratio * width;
height = ratio * height;
确保所有除法都是浮点值。Dark Shikari拥有它。问题中所述的解决方案失败了,因为您没有首先确定哪个dimenson的大小与最大大小之比更大,然后再将两个维度都减少该更大的比例 您当前的解决方案使用一个潜在维度冲突的串行条件分析,然后使用另一个将不起作用
另外请注意,如果您想放大图像,您当前的解决方案将无法运行,而Dark Shikari的解决方案将再次运行。这是我为我的站点开发的一个功能,您可能需要使用。这是基于你上面的答案 它不仅做图像处理,还做其他事情-请删除所有不必要的东西
<?php
$thumb_width = 500;
$thumb_height = 500;
if ($handle = opendir('to-do')) {
echo "Directory handle: $handle<br />";
echo "Files:<br /><br />";
/* This is the correct way to loop over the directory. */
while (false !== ($file = readdir($handle))) {
if ( ($file != ".") && ($file != "..") ){
echo "$file";
$original_path = "to-do/" . $file;
$source_image = ImageCreateFromJPEG( $original_path );
$thumb_width = $thumb_width;
$thumb_height = $thumb_height;
// Create the image, of the required size
$thumbnail = imagecreatetruecolor($thumb_width, $thumb_height);
if($thumbnail === false) {
//creation failed -- probably not enough memory
return null;
}
// Fill the image with a white color (this will be visible in the padding around the image,
// if the aspect ratios of the image and the thumbnail do not match)
// Replace this with any color you want, or comment it out for black.
// I used grey for testing =)
$fill = imagecolorallocate($thumbnail, 255, 255, 255);
imagefill($thumbnail, 0, 0, $fill);
// Compute resize ratio
$hratio = $thumb_height / imagesy($source_image);
$wratio = $thumb_width / imagesx($source_image);
$ratio = min($hratio, $wratio);
// If the source is smaller than the thumbnail size,
// Don't resize -- add a margin instead
// (that is, dont magnify images)
if ($ratio > 1.0)
$ratio = 1.0;
// Compute sizes
$sy = floor(imagesy($source_image) * $ratio);
$sx = floor(imagesx($source_image) * $ratio);
// Compute margins
// Using these margins centers the image in the thumbnail.
// If you always want the image to the top left, set both of these to 0
$m_y = floor(($thumb_height - $sy) / 2);
$m_x = floor(($thumb_width - $sx) / 2);
// Copy the image data, and resample
// If you want a fast and ugly thumbnail, replace imagecopyresampled with imagecopyresized
if (!imagecopyresampled($thumbnail, $source_image,
$m_x, $m_y, //dest x, y (margins)
0, 0, //src x, y (0,0 means top left)
$sx, $sy,//dest w, h (resample to this size (computed above)
imagesx($source_image), imagesy($source_image)) //src w, h (the full size of the original)
) {
//copy failed
imagedestroy($thumbnail);
return null;
}
/* Set the new file name */
$thumbnail_file_name = $file;
/* Apply changes on the original image and write the result on the disk */
ImageJPEG( $thumbnail, $complete_path . "done/" . $thumbnail_file_name );
unset($source_image);
unset($thumbnail);
unset($original_path);
unset($targeted_image_size);
echo " done<br />";
}
}
closedir($handle);
}
?>
我将此函数设置为按比例缩放,它使用给定的宽度、高度,以及您想要的最大宽度/高度(取决于给定的宽度和高度)
用法:
$getScale = scaleProportional(600,200,500);
$targ_w = $getScale['width']; //returns 500
$targ_h = $getScale['height']; //returns 16,6666667
我是这样做的:
+ (NSSize) scaleHeight:(NSSize)origSize
newHeight:(CGFloat)height {
NSSize newSize = NSZeroSize;
if ( origSize.height == 0 ) return newSize;
newSize.height = height;
CGFloat factor = ( height / origSize.height );
newSize.width = (origSize.width * factor );
return newSize;
}
+ (NSSize) scaleWidth:(NSSize)origSize
newWidth:(CGFloat)width {
NSSize newSize = NSZeroSize;
if ( origSize.width == 0 ) return newSize;
newSize.width = width;
CGFloat factor = ( width / origSize.width );
newSize.height = (origSize.height * factor );
return newSize;
}
所以,请记住,它必须被清洁,有可移动部分负载。
+ (NSSize) scaleHeight:(NSSize)origSize
newHeight:(CGFloat)height {
NSSize newSize = NSZeroSize;
if ( origSize.height == 0 ) return newSize;
newSize.height = height;
CGFloat factor = ( height / origSize.height );
newSize.width = (origSize.width * factor );
return newSize;
}
+ (NSSize) scaleWidth:(NSSize)origSize
newWidth:(CGFloat)width {
NSSize newSize = NSZeroSize;
if ( origSize.width == 0 ) return newSize;
newSize.width = width;
CGFloat factor = ( width / origSize.width );
newSize.height = (origSize.height * factor );
return newSize;
}