如果从iOS上传后没有正确定位,可以使用PHP 旋转图片吗?
有些照片旋转90度,而其他照片则正确上传。
答案 0 :(得分:49)
使用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
答案 1 :(得分:18)
图像正在旋转,因为您要以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;
}
答案 2 :(得分:6)
您可以在文件夹
上传图片后添加以下脚本
$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*/
此图片在图片上传后会有效,因此您可以在文件夹上传文件后添加此脚本
答案 3 :(得分:5)
我已经创建了一个用于校正存档图像的功能,您可以使用此功能进行小幅修改以进行空中校正。
<?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);
}
?>
答案 4 :(得分:4)
它并没有完全回答你的问题,但我总是使用这个脚本来确定方向并扩展到预先上传的合理尺寸。这样你就可以为app app用户节省一些带宽,而且没有任何东西可以做服务器端。
- (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;
}
答案 5 :(得分:2)
使用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);
答案 6 :(得分:1)
// 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
答案 7 :(得分:0)
如果你正在使用ImageMagick,它有一个非常简单的解决方法,只需为你的命令添加-auto-orient。
convert -auto-orient -quality 90 -resize 1200x800 $f-new