Изображение с автоповоротом в icms 2.x

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 3 января 2016 в 08:36
С новым годом!
Возможно ли сделать автоповорот изображений? Например добавляются объявления с телефона и все фотографии получаются боком!
Судя по Интернет поиску скрипт простой, но он до сих пор не внедрен в iCMS или я как всегда не вижу той волшебной галочки!?
#2 5 января 2016 в 10:45
Нужна помощь! Up!
#3 5 января 2016 в 19:49
Решение будет работать если фото которые загружаются будут иметь блок IXIF информации, если он удален, тогда скрипт не сможет определить куда повернуть фото.
#4 5 января 2016 в 20:11
полагаю ТС имеет ввиду, что есть скрипты, которые позволяют крутить фотки самостоятельно. такое было у фотогалереи форлода
#5 5 января 2016 в 20:19

полагаю ТС имеет ввиду

yury
не могу предполагать что имел ТС, но ответ был дан в части "автоповорот изображений".
#6 6 января 2016 в 04:12

Решение будет работать если фото которые загружаются будут иметь блок IXIF информации

maxisoft
Это конечно хорошо, но мы говорим о адаптивности системы, т.е. большинство юзверей уже используют телефоны и планшеты (без IXIF). И загружая на большинство сайтов проблем таких нет, во многих cms этот вопрос уже давно решен, на сколько мне известно (не говоря уже о соцсетях).
#7 6 января 2016 в 09:18

Это конечно хорошо, но мы говорим о адаптивности системы, т.е. большинство юзверей уже используют телефоны и планшеты (без IXIF). И загружая на большинство сайтов проблем таких нет, во многих cms этот вопрос уже давно решен, на сколько мне известно (не говоря уже о соцсетях).

Скела
Уважаемый Скела вы хотя бы попытались понять что я Вам ответил, как раз все фото которые сделаны планшетами, смартфонами, имеют в себе блок exif информации о типе камеры, местоположении, где было снято фото, а также о повороте камеры.

Суть в другом что могут грузить фото без данного блока и механизм не будет просто напросто работать, на базе чего должен скрипт определить куда повернуть фото? или вы предлагаете запилить в icms систему ИИ для определения объектов на фото и анализе того что там изображено?
#8 6 января 2016 в 11:37
Анализ EXIF тут не нужен. Нужна просто опция ручного поворота изображения пользователем. ТС ввёл в заблуждение, неправильно назвав тему.
#10 6 января 2016 в 12:48

В оригинале фото (камера Olimpus) — стояло значение тега orientattion Mirror Horisontal,
Изменил оригинал в программе ExifPilot установив значение тега orientation Rotate CW 90
После загрузки в качестве водяного знака.

Видно что изображение повернуто а затем обрезано и уменьшено..
Решение может и не оригинальное но рабочее .
Работает только в JPEG-файлах.
Заменить в файле system/core/uploader функцию public function imageCopyResized на модифицированную :

  1.  
  2. public function imageCopyResized($src, $dest, $maxwidth, $maxheight, $is_square = false, $quality = 100) {
  3.  
  4. if (!file_exists($src)) {
  5. return false;
  6. }
  7.  
  8. $upload_dir = dirname($dest);
  9.  
  10. if (!is_writable($upload_dir)) {
  11. @chmod($dest, 0777);
  12. }
  13. # чтение файла
  14. $orientation=0;
  15. $f=fopen($src,'r');
  16. $tmp=fread($f, 2);
  17. if ($tmp==chr(0xFF).chr(0xD8)) {
  18. $section_id_stop=array(0xFFD8,0xFFDB,0xFFC4,0xFFDD,0xFFC0,0xFFDA,0xFFD9);
  19. while (!feof($f)) {
  20. $tmp=unpack('n',fread($f,2));
  21. $section_id=$tmp[1];
  22. $tmp=unpack('n',fread($f,2));
  23. $section_length=$tmp[1];
  24.  
  25. # Началась секция данных, заканчиваем поиск
  26. if (in_array($section_id, $section_id_stop)) {
  27. break;
  28. }
  29.  
  30. # Найдена EXIF-секция
  31. if ($section_id==0xFFE1) {
  32. $exif=fread($f,($section_length-2));
  33. # Это действительно секция EXIF?
  34. if (substr($exif,0,4)=='Exif') {
  35. # Определить порядок следования байт
  36. switch (substr($exif,6,2)) {
  37. case 'MM': {
  38. $is_motorola=true;
  39. break;
  40. }
  41. case 'II': {
  42. $is_motorola=false;
  43. break;
  44. }
  45. }
  46. # Количество тегов
  47. if ($is_motorola) {
  48. $tmp=unpack('N',substr($exif,10,4));
  49. $offset_tags=$tmp[1];
  50. $tmp=unpack('n',substr($exif,14,2));
  51. $num_of_tags=$tmp[1];
  52. }
  53. else {
  54. $tmp=unpack('V',substr($exif,10,4));
  55. $offset_tags=$tmp[1];
  56. $tmp=unpack('v',substr($exif,14,2));
  57. $num_of_tags=$tmp[1];
  58. }
  59. if ($num_of_tags==0) { return true; }
  60.  
  61. $offset=$offset_tags+8;
  62.  
  63. # Поискать тег Orientation
  64. for ($i=0; $i<$num_of_tags; $i++) {
  65. if ($is_motorola) {
  66. $tmp=unpack('n',substr($exif,$offset,2));
  67. $tag_id=$tmp[1];
  68. $tmp=unpack('n',substr($exif,$offset+8,2));
  69. $value=$tmp[1];
  70. }
  71. else {
  72. $tmp=unpack('v',substr($exif,$offset,2));
  73. $tag_id=$tmp[1];
  74. $tmp=unpack('v',substr($exif,$offset+8,2));
  75. $value=$tmp[1];
  76. }
  77. $offset+=12;
  78.  
  79. # Orientation
  80. if ($tag_id==0x0112) {
  81. $orientation=$value;
  82. break;
  83. }
  84. }
  85. }
  86. }
  87. else {
  88. # Пропустить секцию
  89. fseek($f, ($section_length-2), SEEK_CUR);
  90. }
  91. # Тег Orientation найден
  92. if ($orientation) { break; }
  93. }
  94. }
  95. fclose($f);
  96.  
  97. $size = getimagesize($src);
  98.  
  99. if ($size === false) {
  100. return false;
  101. }
  102.  
  103. $new_width = $size[0];
  104. $new_height = $size[1];
  105.  
  106. if (($new_height <= $maxheight) && ($new_width <= $maxwidth)) {
  107. @copy($src, $dest);
  108. return true;
  109. }
  110.  
  111. $format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
  112. $icfunc = "imagecreatefrom" . $format;
  113.  
  114. if (!function_exists($icfunc)) {
  115. return false;
  116. }
  117.  
  118. $isrc = $icfunc($src);
  119. # ориентация
  120. if ($orientation) {
  121. switch($orientation) {
  122. # Поворот на 180 градусов
  123. case 3: {
  124. $isrc=imagerotate($isrc,180,0);
  125. break;
  126. }
  127. # Поворот вправо на 90 градусов
  128. case 6: {
  129. $isrc=imagerotate($isrc,-90,0);
  130. break;
  131. }
  132. # Поворот влево на 90 градусов
  133. case 8: {
  134. $isrc=imagerotate($isrc,90,0);
  135. break;
  136. }
  137. }
  138. }
  139.  
  140. if ($is_square) {
  141. $idest = imagecreatetruecolor($maxwidth, $maxwidth);
  142. imagefill($idest, 0, 0, 0xFFFFFF);
  143. if ($new_width > $new_height)
  144. imagecopyresampled($idest, $isrc, 0, 0, round((max($new_width, $new_height) - min($new_width, $new_height)) / 2), 0, $maxwidth, $maxwidth, min($new_width, $new_height), min($new_width, $new_height));
  145. if ($new_width < $new_height)
  146. imagecopyresampled($idest, $isrc, 0, 0, 0, 0, $maxwidth, $maxwidth
#11 6 января 2016 в 13:07
Геннадий Иванович,

А зачем такой комбайн изобретать разбирать заголовки самому? если вы используете дальше GD😊
  1.  
  2. $exif = exif_read_data(тут наша картинка);
  3. if(!empty($exif['Orientation'])) {
  4. switch($exif['Orientation']) {
  5. case 8:
  6. $image = imagerotate($image,90,0);
  7. break;
  8. case 3:
  9. $image = imagerotate($image,180,0);
  10. break;
  11. case 6:
  12. $image = imagerotate($image,-90,0);
  13. break;
  14. }
  15. }
  16.  
#12 6 января 2016 в 13:50

А зачем такой комбайн изобретать разбирать заголовки самому? если вы используете дальше GD

maxisoft
Я думаю вы не единственный кто знает о exif_read_data?
maxisoft сперва следовало подробнее ознакомиться с текстом описания решения автора, www.manhunter.ru/webmaster/892_povorot_izobrazheniya_na_osnovanii_dannih_exif.html
Где описаны некоторые проблемы которые безусловно нужно учитывать.
Я это решение выполнил на коленках, взяв первое попавшееся (на мой взгляд) правильное решение.
Мои действия несут в себе хоть и малую но логическую составляющую, с примером реализации данного вопроса.
#13 6 января 2016 в 14:33

maxisoft сперва следовало подробнее ознакомиться с текстом описания решения автора, www.manhunter.ru/webmaster/892_povorot_izobrazheniya_na_osnovanii_dannih_exif.html
Где описаны некоторые проблемы которые безусловно нужно учитывать.

Геннадий Иванович

vЗачет.
#14 7 января 2016 в 10:51
Геннадий Иванович, функция конечно радует, но справа всегда чёрный обрезок.
maxisoft, я не предлагаю ИИ, я просто в замешательстве. Просто представьте, что каждый добавляющий с телефона закидывает фотографии боком и ничего с этим не может поделать.
Действительно лучшим решением была бы возможность вращать изображение самостоятельно.
#15 7 января 2016 в 14:08

Действительно лучшим решением была бы возможность вращать изображение самостоятельно.

Скела
Вот поэтому стоит немного правильнее ставить задачу, ведь от того как поставить задачу и вопрос и предлагается решение.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.