Zdjęcie zmiejsza się prawidłowo, ale do góry nogami

0

Mam taki problem mam skrypt pobrany z netu i problem jest w tym, że prawidłowo zmniejsza zdjęcie, ale zapisuje je do góry nogami. Daje kod

<?php

/**
* Generuje miniaturkę lub pomniejszony obrazek,
* szerokość domyślnie ustawiona jest na 55 pikseli.
* @param string $plik — ścieżka do pliku jpeg
* @param string $szerokosc — szerokość pliku w px
* @return boolean
*/

resize("./zdjecia/20141004_112332.jpg",100);
function resize( $plik, $szerokosc) {
// pobieramy rozszerzenie pliku, na tej podstawie
// korzystamy potem z odpowiednich funkcji GD
$i = explode(".", $plik);

// rozszerzeniem pliku jest ostatni element tablicy $i
$rozszerzenie = end($i);

// jeśli nie mamy jpega, gifa lub png zwracamy false.
if($rozszerzenie !== "jpg" &&
$rozszerzenie !== "gif" &&
$rozszerzenie !== "png") {
return false;
}

// pobieramy rozmiary obrazka
list($img_szer, $img_wys) = getimagesize($plik);

// obliczamy proporcje boków
$proporcje = $img_wys / $img_szer;

// na tej podstawie obliczamy wysokość
$wysokosc = $szerokosc * $proporcje;

// tworzymy nowy obrazek o zadanym rozmiarze
// korzystamy tu z funkcji biblioteki GD
// która musi być dołączona do twojej instalacji PHP,
// najpierw tworzymy canvas.
$canvas = imagecreatetruecolor($szerokosc, $wysokosc);
switch($rozszerzenie) {
case "jpg":
$org = imagecreatefromjpeg($plik);
break;
case "gif":
$org = imagecreatefromgif($plik);
break;
case "png":
$org = imagecreatefrompng($plik);
break;
}

// kopiujemy obraz na nowy canvas
imagecopyresampled($canvas, $org, 0, 0, 0, 0,$szerokosc, $wysokosc, $img_szer, $img_wys);

// zapisujemy jako jpeg, jakość 70/100
if(imagejpeg($canvas, $plik . "_mini", 70)) {
return true;
} else {
return false;
}
}

?> 
0

przed zgraniem obrazka do pliku, wykonaj rotację obrazka:
$canvas = imagerotate($canvas, 180, 0);
i już.

0

Teraz w ogóle jest dziwna sytuacja wcześniej tego nie zauważyłem, że dla niektórych zdjęć bez użycia tego obracania obrazki wychodzą dobrze, a dla niektórych wychodzą obrócone i jak zastosuje ta twoją funkcję to te obrazki co miały wyjść obrócone będą nie obrócone, a dla tych co bez tej funkcji dam to będą obrócone i te obrazki różnią się tylko nazwą wszystkie mają rozszerzenie jpg.

1

Tu wszedłeś na trochę śliski temat obrotu obrazków
Od kiedy do użycia weszły smartfony i aparaty z akcelerometrami - zdjęcia dostały nowe oznaczenia które mówią jak obrócony był aparat w momencie robienia zdjęcia

Problem jest taki, że te zdjęcia nie są naprawdę odwrócone tylko jest zapisana informacja o tym że są odwrócone - część programów nie jest do tego przystosowana i w niektórych viewerach zdjęcie będzie "normalnie" a w niektórych odwrócone
Tak samo tutaj metoda imagecopyresampled nie bierze niestety pod uwagę tego oznaczenia

Rozwiązaniem jest ręczne odczytanie tagu Orientation z grupy IFD0 oznaczającego obrót, a następnie obrócenie obrazka przed skopiowaniem (lub po, ale tu dojdzie kwestia obrotu proporcji obrazu)

http://www.impulseadventure.com/photo/exif-orientation.html

1

Możesz też po prostu skopiować ten tag z obrazka źródłowego na docelowy

Kod do obrotu znaleziony w necie:

$exif = exif_read_data($path);
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;
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1