100px x100pxのサイズのサムネイルを作成しようとしています。方法を説明している記事をたくさん見てきましたが、寸法比を維持する場合、ほとんどの記事は幅!=高さになります。
たとえば、450x350ピクセルの画像があります。 100px x100pxにトリミングしたいのですが。比率を維持すると、100x77pxになります。これにより、これらの画像を行と列にリストするときに見苦しくなります。ただし、寸法比のない画像もひどく見えます。
flickrの画像を見たことがありますが、見た目は素晴らしいです。例えば:
サムネイル: http://farm1.static.flickr.com/23/32608803_29470dfeeb_s.jpg
ミディアムサイズ: http://farm1.static.flickr.com/23/32608803_29470dfeeb.jpg
大きいサイズ: http://farm1.static.flickr.com/23/32608803_29470dfeeb_b.jpg
tks
これは、画像の一部のみを1:1のアスペクト比(主に画像の中央)のサムネイルとして使用することによって行われます。よく見ると、flickrのサムネイルで確認できます。
あなたの質問には「作物」が含まれているので、あなたがこれをまだ知らなかったかどうかはわかりませんが、それでは何を知りたいですか?
トリミングを使用するための例を次に示します。
//Your Image
$imgSrc = "image.jpg";
//getting the image dimensions
list($width, $height) = getimagesize($imgSrc);
//saving the image into memory (for manipulation with Gd Library)
$myImage = imagecreatefromjpeg($imgSrc);
// calculating the part of the image to use for thumbnail
if ($width > $height) {
$y = 0;
$x = ($width - $height) / 2;
$smallestSide = $height;
} else {
$x = 0;
$y = ($height - $width) / 2;
$smallestSide = $width;
}
// copying the part into thumbnail
$thumbSize = 100;
$thumb = imagecreatetruecolor($thumbSize, $thumbSize);
imagecopyresampled($thumb, $myImage, 0, 0, $x, $y, $thumbSize, $thumbSize, $smallestSide, $smallestSide);
//final output
header('Content-type: image/jpeg');
imagejpeg($thumb);
このコードを使用できます。ソース画像のパスとサムネイルのサイズをピクセル単位で渡し、オプションの宛先パスを渡す必要があります。合格すると画像が保存され、合格しないと親指が表示されます。
Jpg、jpeg、pngのみが許可されています。
function cropImage($sourcePath, $thumbSize, $destination = null) {
$parts = explode('.', $sourcePath);
$ext = $parts[count($parts) - 1];
if ($ext == 'jpg' || $ext == 'jpeg') {
$format = 'jpg';
} else {
$format = 'png';
}
if ($format == 'jpg') {
$sourceImage = imagecreatefromjpeg($sourcePath);
}
if ($format == 'png') {
$sourceImage = imagecreatefrompng($sourcePath);
}
list($srcWidth, $srcHeight) = getimagesize($sourcePath);
// calculating the part of the image to use for thumbnail
if ($srcWidth > $srcHeight) {
$y = 0;
$x = ($srcWidth - $srcHeight) / 2;
$smallestSide = $srcHeight;
} else {
$x = 0;
$y = ($srcHeight - $srcWidth) / 2;
$smallestSide = $srcWidth;
}
$destinationImage = imagecreatetruecolor($thumbSize, $thumbSize);
imagecopyresampled($destinationImage, $sourceImage, 0, 0, $x, $y, $thumbSize, $thumbSize, $smallestSide, $smallestSide);
if ($destination == null) {
header('Content-Type: image/jpeg');
if ($format == 'jpg') {
imagejpeg($destinationImage, null, 100);
}
if ($format == 'png') {
imagejpeg($destinationImage);
}
if ($destination = null) {
}
} else {
if ($format == 'jpg') {
imagejpeg($destinationImage, $destination, 100);
}
if ($format == 'png') {
imagepng($destinationImage, $destination);
}
}
}
幅または高さの小さい方に基づいて正方形で画像を切り抜く
public function croppThis($target_url) {
$this->jpegImgCrop($target_url);
}
$ target_url-は画像の名前です。
public function jpegImgCrop($target_url) {//support
$image = imagecreatefromjpeg($target_url);
$filename = $target_url;
$width = imagesx($image);
$height = imagesy($image);
$image_type = imagetypes($image); //IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP | IMG_XPM
if($width==$height) {
$thumb_width = $width;
$thumb_height = $height;
} elseif($width<$height) {
$thumb_width = $width;
$thumb_height = $width;
} elseif($width>$height) {
$thumb_width = $height;
$thumb_height = $height;
} else {
$thumb_width = 150;
$thumb_height = 150;
}
$original_aspect = $width / $height;
$thumb_aspect = $thumb_width / $thumb_height;
if ( $original_aspect >= $thumb_aspect ) {
// If image is wider than thumbnail (in aspect ratio sense)
$new_height = $thumb_height;
$new_width = $width / ($height / $thumb_height);
}
else {
// If the thumbnail is wider than the image
$new_width = $thumb_width;
$new_height = $height / ($width / $thumb_width);
}
$thumb = imagecreatetruecolor( $thumb_width, $thumb_height );
// Resize and crop
imagecopyresampled($thumb,
$image,
0 - ($new_width - $thumb_width) / 2, // Center the image horizontally
0 - ($new_height - $thumb_height) / 2, // Center the image vertically
0, 0,
$new_width, $new_height,
$width, $height);
imagejpeg($thumb, $filename, 80);
}
@SvenKoschnickeコードを完成させるために、他の画像形式を処理するための小さなツールを次に示します。
$sourceProperties = getimagesize($imgSrc);
$width = $sourceProperties[0];
$height = $sourceProperties[1];
switch ($sourceProperties[2]) {
case IMAGETYPE_PNG:
$myImage = imagecreatefrompng($imgSrc);
break;
case IMAGETYPE_GIF:
$myImage = imagecreatefromgif($imgSrc);
break;
case IMAGETYPE_JPEG:
$myImage = imagecreatefromjpeg($imgSrc);
break;
}
GDLibを使用して画像をいじるのが好きです。操作も素晴らしく簡単です。そこにはたくさんのブログ投稿やチュートリアルがあります。ただし、画像のすべてのバリエーションの処理には非常に時間がかかる可能性があるため、クラスなどを使用することをお勧めします。