图像获取有关上传

问题描述:

我想上传一个base64编码的图像和解码之后保存自动旋转。图像上传和保存,我可以访问它使用的URL和一切..但图像逆时针旋转90度,我不知道为什么!图像获取有关上传

从哪里获得的编码数据也好,把它在<img />的地方工作正常!

function saveImageData($base64Data) { 
    $base64_decoded = base64_decode($base64Data); 
    $im = imagecreatefromstring($base64_decoded); 
    if ($im !== false) { 
     $imagepath = '/public/uploads/' . time() . '.jpg'; 
     imagejpeg($im, $imagepath); 
     chmod($imagepath, 0755); 
     imagedestroy($im); 
    } else { 
     return false; 
    } 
    return $imagepath; 
} 

我没有使用任何旋转功能,但仍然旋转。我可以使用PHP的GD函数一样imagerotate,但不希望像黑色的背景等

如果你能help..you r为awesomest人的原因!

+0

我知道这是旧的,但只是想我会提到:如果你能帮助它,不要上传之前base64encode照片。你增加了20%的大小。 PhoneGap支持文件上传http://docs.phonegap.com/en/1.9.0/cordova_file_file.md.html#FileTransfer – 2012-07-03 00:31:33

+0

当时,我写这篇文章的时候,Phonegap不是Codorva,只是Nitobi的Phonegap和API都没有。 t支持多部分POST请求。 此外,我们决定放弃Phonegap&原生! – detj 2012-07-03 18:34:33

+0

我遇到与移动网络应用相同的问题。任何想法为什么? – Orane 2015-05-20 00:42:31

我的猜测是,你要上传的图像实际上是旋转,但被纠正,因为它包含了EXIF部分旋转数据。 (例如,相机在拍摄照片时可能会知道纵向方向,并将该信息保存在EXIF数据中;某些查看软件会知道旋转数据,并在查看照片时自动旋转照片。)在这种情况下,图片可能只是出现为你旋转,这取决于你用什么来查看它。

是否使用相同的软件查看“上传之前”和“上传后”的图像?如果你看到他们都使用同一个网络浏览器会发生什么情况呢?

,如果你从不同的来源尝试不同的形象,最好是会发生什么?你有任何软件可以让你查看图像的EXIF数据吗?寻找“方向”价值;除了“1”以外的任何东西都意味着图像有一个旋转设置(请参阅this page以获得体面的描述)。

因此,总之,我想说JPEG文件中的底层图像是“错误的“方向,并且EXIF数据包含纠正该旋转以进行显示的信息。例如,如果来源是刚刚与我一起玩过的iPhone似乎以横向方向存储其底层图像数据,但是如果实际拍摄图像(因此应该显示该图像)则设置EXIF数据)作为肖像。解决它

最好的办法是几乎可以肯定检查EXIF数据在上传后的文件,使用PHP EXIF functions和旋转图像需要保存自己的副本之前,纠正方向。

+0

感谢您的洞察!我实际上是从iPhone/iPod Touch相机拍摄照片或从iOS相册中选择。基本上,我使用Phonegap构建iOS应用程序(http://phonegap.com) 我会检查这个EXIF方向的东西,然后回去..也许这可能是它! – detj 2011-03-14 18:36:31

+0

这里的PhoneGap的文档(http://docs.phonegap.com/phonegap_camera_camera.md.html#Camera),那我下面进入正base64编码的图像数据 – detj 2011-03-14 18:41:20

+0

@detj是的,如果它是一个图像从iPhone,我认为我的理论很可能是对的。例如,我只用iPhone拍摄了两张照片,一张横向照片,一张纵向照片。虽然它们在iPhoto中看起来都具有“正确”的方向,例如,这些图片本身都是* 2048 *宽* 1536 *高*,甚至是“肖像”照片。纵向照片实际上存储为横向,EXIF数据表示它已旋转,因此iPhoto会自动更正。我猜这张照片是通过_unchanged_到达您的网站的,但展示的只是原始的,未旋转的图像。 – 2011-03-14 23:45:04

我在制作移动混合应用程序时遇到此问题,该应用程序使用Cordova访问手机相机并将图像发布到服务器。我通过将correctOrientation属性设置为true来解决它。

navigator.camera.getPicture(onSuccess, onFail, 
         { 
          quality: 80, 
          destinationType:Camera.DestinationType.DATA_URL, 
          correctOrientation : true 
         }); 

<?php 
if (isset($_POST['submit'])) { 
    $filename = $_FILES['file']['name']; 
    $filePath = $_FILES['file']['tmp_name']; 
    $exif = exif_read_data($_FILES['file']['tmp_name']); 
    echo "<pre>"; 
    print_r($exif); 
    echo "</pre>"; 
    if (!empty($exif['Orientation'])) { 
     $imageResource = imagecreatefromjpeg($filePath); 
     switch ($exif['Orientation']) { 
      case 3: 
       $image = imagerotate($imageResource, 180, 0); 
       break; 
      case 6: 
       $image = imagerotate($imageResource, -90, 0); 
       break; 
      case 8: 
       $image = imagerotate($imageResource, 90, 0); 
       break; 
      default: 
       $image = $imageResource; 
     } 
     imagejpeg($image, $filename, 90); 
    } 
} 
?> 
<form class="form-horizontal" method="post" enctype="multipart/form-data"> 
    <div class="form-group"> 
     <div class="col-md-9"> 
      <div class="input-group"> 
       <span class="input-group-btn"> 
        <span class="btn btn-default btn-file"> 
         Choose img<input type="file" name="file" id="imgInp"> 
        </span> 
       </span> 

      </div> 
     </div> 
    </div> 
    <button name="submit" type="submit">Send</button> 
</form>