IOSからアップロードした後に画像が正しく配置されていない場合、PHP onlyで画像を回転させる方法はありますか?
他の人が正しくアップロードする間、いくつかの写真は90度回転します。
画像をJPEGで保存しているため、画像が回転しています。画像をPNGで保存した場合、向きは変わりません。これは、向きの問題を修正するためのコードです。
- (UIImage *)fixrotation:(UIImage *)image{
if (image.imageOrientation == UIImageOrientationUp) return image;
CGAffineTransform transform = CGAffineTransformIdentity;
switch (image.imageOrientation) {
case UIImageOrientationDown:
case UIImageOrientationDownMirrored:
transform = CGAffineTransformTranslate(transform, image.size.width, image.size.height);
transform = CGAffineTransformRotate(transform, M_PI);
break;
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
transform = CGAffineTransformTranslate(transform, image.size.width, 0);
transform = CGAffineTransformRotate(transform, M_PI_2);
break;
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
transform = CGAffineTransformTranslate(transform, 0, image.size.height);
transform = CGAffineTransformRotate(transform, -M_PI_2);
break;
case UIImageOrientationUp:
case UIImageOrientationUpMirrored:
break;
}
switch (image.imageOrientation) {
case UIImageOrientationUpMirrored:
case UIImageOrientationDownMirrored:
transform = CGAffineTransformTranslate(transform, image.size.width, 0);
transform = CGAffineTransformScale(transform, -1, 1);
break;
case UIImageOrientationLeftMirrored:
case UIImageOrientationRightMirrored:
transform = CGAffineTransformTranslate(transform, image.size.height, 0);
transform = CGAffineTransformScale(transform, -1, 1);
break;
case UIImageOrientationUp:
case UIImageOrientationDown:
case UIImageOrientationLeft:
case UIImageOrientationRight:
break;
}
// Now we draw the underlying CGImage into a new context, applying the transform
// calculated above.
CGContextRef ctx = CGBitmapContextCreate(NULL, image.size.width, image.size.height,
CGImageGetBitsPerComponent(image.CGImage), 0,
CGImageGetColorSpace(image.CGImage),
CGImageGetBitmapInfo(image.CGImage));
CGContextConcatCTM(ctx, transform);
switch (image.imageOrientation) {
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
// Grr...
CGContextDrawImage(ctx, CGRectMake(0,0,image.size.height,image.size.width), image.CGImage);
break;
default:
CGContextDrawImage(ctx, CGRectMake(0,0,image.size.width,image.size.height), image.CGImage);
break;
}
// And now we just create a new UIImage from the drawing context
CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
UIImage *img = [UIImage imageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
return img;
}
exif_read_data を使用して、画像の向きを調べます。
$exif = exif_read_data('image.jpg');
if (isset($exif['Orientation']))
{
switch ($exif['Orientation'])
{
case 3:
// Need to rotate 180 deg
break;
case 6:
// Need to rotate 90 deg clockwise
break;
case 8:
// Need to rotate 90 deg counter clockwise
break;
}
}
方向コードの説明はここにあります: http://www.impulseadventure.com/photo/exif-orientation.html
アーカイブされた画像を修正する機能を作成しましたが、これをオンエア修正の小さな変更で使用できます。
<?php
/*
Correct image orientation v1.0
Author: Mathuvathanan Mounasamy
Licensed under the MIT license
This function correct all the images' orientation in a given path or directory.
Run: php -r "require 'correctImageOrientation.php'; correctImageOrientation('test/');"
or
php -r "require 'correctImageOrientation.php'; correctImageOrientation('test/test1');"
or
php -r "require 'correctImageOrientation.php'; correctImageOrientation('test');"
*/
function correctImageOrientation($directory) {
$scanned_directory = array_diff(scandir($directory), array('..', '.'));
echo "<pre>";
print_r("scanned directory: \r\n");
print_r($scanned_directory);
echo "</pre>\r\n";
foreach ($scanned_directory as &$file) {
if (is_dir($directory."/".$file)) {
correctImageOrientation($directory."/".$file);
} else {
$filen = explode(".", $file);
$ext = end($filen);
try {
$exif = @exif_read_data($directory."/".$file);
$orientation = $exif['Orientation'];
if (isset($orientation) && $orientation != 1){
switch ($orientation) {
case 3:
$deg = 180;
break;
case 6:
$deg = 270;
break;
case 8:
$deg = 90;
break;
}
if ($deg) {
// If png
if ($ext == "png") {
$img_new = imagecreatefrompng($directory."/".$file);
$img_new = imagerotate($img_new, $deg, 0);
// Save rotated image
imagepng($img_new,$directory.$file);
}else {
$img_new = imagecreatefromjpeg($directory."/".$file);
$img_new = imagerotate($img_new, $deg, 0);
// Save rotated image
imagejpeg($img_new,$directory."/".$file,80);
}
}
echo "<pre>";
print_r("image changed: \r\n");
print_r($directory."/".$file);
echo "</pre>\r\n";
}
} catch (Exception $e) {
echo "error:";
echo $e;
echo "error";
}
}
}
unset($file);
}
?>
それはあなたの質問に完全に答えるものではありませんが、私は常にこのスクリプトを使用して、向きと拡大縮小を適切なサイズの事前アップロードに修正します。このようにして、アプリユーザーの帯域幅を節約し、サーバー側で行うことは何もありません。
- (UIImage *)scaleAndRotateImage:(UIImage *)image {
int kMaxResolution = 1024; // Or whatever
CGImageRef imgRef = image.CGImage;
CGFloat width = CGImageGetWidth(imgRef);
CGFloat height = CGImageGetHeight(imgRef);
CGAffineTransform transform = CGAffineTransformIdentity;
CGRect bounds = CGRectMake(0, 0, width, height);
if (width > kMaxResolution || height > kMaxResolution) {
CGFloat ratio = width/height;
if (ratio > 1) {
bounds.size.width = kMaxResolution;
bounds.size.height = roundf(bounds.size.width / ratio);
}
else {
bounds.size.height = kMaxResolution;
bounds.size.width = roundf(bounds.size.height * ratio);
}
}
CGFloat scaleRatio = bounds.size.width / width;
CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
CGFloat boundHeight;
UIImageOrientation orient = image.imageOrientation;
switch(orient) {
case UIImageOrientationUp: //EXIF = 1
transform = CGAffineTransformIdentity;
break;
case UIImageOrientationUpMirrored: //EXIF = 2
transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
transform = CGAffineTransformScale(transform, -1.0, 1.0);
break;
case UIImageOrientationDown: //EXIF = 3
transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
transform = CGAffineTransformRotate(transform, M_PI);
break;
case UIImageOrientationDownMirrored: //EXIF = 4
transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
transform = CGAffineTransformScale(transform, 1.0, -1.0);
break;
case UIImageOrientationLeftMirrored: //EXIF = 5
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
transform = CGAffineTransformScale(transform, -1.0, 1.0);
transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
break;
case UIImageOrientationLeft: //EXIF = 6
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
break;
case UIImageOrientationRightMirrored: //EXIF = 7
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeScale(-1.0, 1.0);
transform = CGAffineTransformRotate(transform, M_PI / 2.0);
break;
case UIImageOrientationRight: //EXIF = 8
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
transform = CGAffineTransformRotate(transform, M_PI / 2.0);
break;
default:
[NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];
}
UIGraphicsBeginImageContext(bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) {
CGContextScaleCTM(context, -scaleRatio, scaleRatio);
CGContextTranslateCTM(context, -height, 0);
}
else {
CGContextScaleCTM(context, scaleRatio, -scaleRatio);
CGContextTranslateCTM(context, 0, -height);
}
CGContextConcatCTM(context, transform);
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return imageCopy;
}
フォルダに画像をアップロードした後、以下のスクリプトを追加できます
$filename = "/files/1.jpg"; /*ADD YOUR FILENAME WITH PATH*/
$exif = exif_read_data($filename);
$ort = $exif['Orientation']; /*STORES ORIENTATION FROM IMAGE */
$ort1 = $ort;
$exif = exif_read_data($filename, 0, true);
if (!empty($ort1))
{
$image = imagecreatefromjpeg($filename);
$ort = $ort1;
switch ($ort) {
case 3:
$image = imagerotate($image, 180, 0);
break;
case 6:
$image = imagerotate($image, -90, 0);
break;
case 8:
$image = imagerotate($image, 90, 0);
break;
}
}
imagejpeg($image,$filename, 90); /*IF FOUND ORIENTATION THEN ROTATE IMAGE IN PERFECT DIMENSION*/
このスクリプトは画像がフォルダにアップロードされた後に機能するため、ファイルをフォルダにアップロードした後にこのスクリプトを追加できます
Gdライブラリを使用して、PHPで画像を操作できます。このスクリプトは、imagerotate()関数を使用して写真を回転させます。この例では90度回転していますが、これはスクリプトで変更できます。
<?php
// The file you are rotating
$image = 'myfile.jpg';
//How many degrees you wish to rotate
$degrees = 90;
// This sets the image type to .jpg but can be changed to png or gif
header('Content-type: image/jpeg') ;
// Create the canvas
$source = imagecreatefromjpeg($image) ;
// Rotates the image
$rotate = imagerotate($source, $degrees, 0) ;
// Outputs a jpg image, you could change this to gif or png if needed
imagejpeg($rotate) ;
?>
このスクリプトの最も重要な部分である回転は、imagerotate()関数で行われます。この関数のパラメーターは次のとおりです。
imagerotate (The_image, degrees_to_rotate, background_color, Optional_ignore_transparency)
オプションの透明度無視が空白または0の場合、透明度は保持されます。
array getimagesize ( string $filename [, array &$imageinfo ] )
Getimagesize()関数は特定の画像ファイルのサイズを決定し、通常のHTML IMGタグおよび対応するHTTPコンテンツタイプ内で使用されるファイルタイプと高さ/幅のテキスト文字列とともに寸法を返します。
Imagejpegで画像を保存することもできます。 http://www.php.net/manual/en/function.imagejpeg.php
// Save the image as 'path/to/myfile.jpg'
imagejpeg($image, 'path/to/myfile.jpg');
// Free up memory
imagedestroy($image);
// File and rotation
$filename = 'test.jpg';
$degrees = 180;
// Content type
header('Content-type: image/jpeg');
// Load
$source = imagecreatefromjpeg($filename);
// Rotate
$rotate = imagerotate($source, $degrees, 0);
// Output
imagejpeg($rotate);
check this link :
http://www.php.net/manual/en/function.imagerotate.php
imageMagickを使用している場合は、非常に単純な修正があり、コマンドに-auto-orientを追加するだけです。
convert -auto-orient -quality 90 -resize 1200x800 $f-new