Ну, это ново. Загрузка фотографий с смартфонов невозможна?

Поэтому я создаю отзывчивый веб-сайт, который имеет возможность загружать изображения на страницу. Скрипт php в основном изменяет размер изображения и сохраняет путь к файлу большого пальца в базе данных. Исходное изображение и изображение большого пальца также сохраняются в папке веб-сайта. Я использую библиотеку GD.

Во всяком случае, я просто делал тест на загрузку фотографии с моего iphone на сайт. Он загружает изображение. Однако есть две проблемы.

  1. Для загрузки фотографии требуется слишком много времени.
  2. Фотография ориентирована сбоку после того, как она была загружена. Если фотография была портрета, она будет загружаться как пейзаж. Weird.

Может ли кто-нибудь помочь мне с этими двумя проблемами?

КОД ОБНОВЛЕНИЯ

if (isset($_FILES['image'])) { if (empty($_FILES['image']['name'])) { ?><div class="add-errors">Please choose an image!</div><?php } else { function getOrientedImage($imagePath){ $image = imagecreatefromstring(file_get_contents($imagePath)); $exif = exif_read_data($imagePath); if(!empty($exif['Orientation'])) { switch($exif['Orientation']) { case 8: $image = imagerotate($image,90,0); break; case 3: $image = imagerotate($image,180,0); break; case 6: $image = imagerotate($image,-90,0); break; } } return $image; } $name = $_FILES['image']['name']; $temp = $_FILES['image']['tmp_name']; $type = $_FILES['image']['type']; $size = $_FILES['image']['size']; $ext = strtolower(end(explode('.', $name))); $size2 = getimagesize($temp); $width = $size2[0]; $height = $size2[1]; $upload = md5( rand( 0, 1000 ) . rand( 0, 1000 ) . rand( 0, 1000 ) . rand( 0, 1000 )); // Restrictions for uploading $maxwidth = 6000; $maxheight = 6000; $allowed = array('image/jpeg', 'image/jpg', 'image/png', 'image/gif'); // Recognizing the extension switch($type){ // Image/Jpeg case 'image/jpeg': $ext= '.jpeg'; break; // Image/Jpg case 'image/jpg': $ext= '.jpg'; break; // Image/png case 'image/png': $ext= '.png'; break; // Image/gif case 'image/gif': $ext= '.gif'; break; } // upload variables $path = $userDir . $upload . $ext; $thumb_path = $userDir . 'thumb_' . $upload . $ext; // check if extension is allowed. if (in_array($type, $allowed)) { // Checking if the resolution is FULLHD or under this resolution. if ($width <= $maxwidth && $height <= $maxheight) { if ($size <= 5242880) { // check the shape of the image if ($width == $height) {$shape = 1;} if ($width > $height) {$shape = 2;} if ($width < $height) {$shape = 2;} //Adjusting the resize script on shape. switch($shape) { // Code to resize a square image. case 1: $newwidth = 690; $newheight = 690; break; // Code to resize a tall image case 2: $newwidth = 690; $ratio = $newwidth / $width; $newheight = round($height * $ratio); break; } // Resizing according to extension. switch ($type) { // Image/Jpeg case 'image/jpeg'; $img = getOrientedImage($temp); $thumb = imagecreatetruecolor($newwidth, $newheight); imagecopyresized($thumb, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); imagejpeg($thumb, $thumb_path); break; // Image/Jpg case 'image/jpg'; $img = getOrientedImage($temp); $thumb = imagecreatetruecolor($newwidth, $newheight); imagecopyresized($thumb, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); imagejpeg($thumb, $thumb_path); break; // Image/png case 'image/png'; $img = getOrientedImage($temp); $thumb = imagecreatetruecolor($newwidth, $newheight); imagecopyresized($thumb, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); imagepng($thumb, $thumb_path); break; // Image/gif case 'image/gif'; $img = getOrientedImage($temp); $thumb = imagecreatetruecolor($newwidth, $newheight); imagecopyresized($thumb, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); imagegif($thumb, $thumb_path); break; } // Move the original file aswell. move_uploaded_file($temp, $path); } else { ?><div class="add-errors">Your image size is too big!</div><?php } } else { ?><div class="add-errors">Your image resolution exceeds the limit!</div><?php } } else { ?><div class="add-errors">Your have uploaded a forbidden extension!</div><?php } } } 

Вы можете захотеть просмотреть функцию exif_read_data () и посмотреть на значение ['Orientation'] , которое возвращается в массиве. Как правило, телефон или камера с датчиками ориентации хранят изображение в одной ориентации или другой, а затем добавляют соответствующие флажки ориентации к данным exif на изображении. Затем перед устройством просмотра изображений или процессором изображения определяется, следует ли вращать необработанное изображение перед отображением или обработкой изображения.

В комментариях к этой странице есть несколько замечательных примеров.

Функция, построенная из одного из примеров на этой странице:

 <?php function getOrientedImage($imagePath){ $image = imagecreatefromstring(file_get_contents($imagePath)); $exif = exif_read_data($imagePath); if(!empty($exif['Orientation'])) { switch($exif['Orientation']) { case 8: $image = imagerotate($image,90,0); break; case 3: $image = imagerotate($image,180,0); break; case 6: $image = imagerotate($image,-90,0); break; } } return $image; } ?> 

Кроме того, что касается времени загрузки, если устройство использует сотовые вышки для передачи данных, ваши скорости загрузки, вероятно, составляют часть ваших скоростей загрузки. Для сравнения, большинство приложений для социальных сетей изменяет размер изображения перед загрузкой, тогда как ваша веб-страница, вероятно, этого не делает. Так как телефоны занимают 8 мегапикселей или больше фотографий, это добавляет к большому количеству данных.

1) Не уверен, что что-то вы можете сделать по этому поводу, вы загружаете выбранное пользователем изображение. В приложении я мог бы уменьшить изображение перед передачей.

2) Независимо от того, что вы ищете для просмотра фотографии (или создания эскизов), вероятно, не соблюдается флаг ориентации на фотографии.