Buduję aplikację, która używa aparatu do robienia zdjęć. Oto mój kod źródłowy, aby to zrobić:
File file = new File(Environment.getExternalStorageDirectory(),
imageFileName);
imageFilePath = file.getPath();
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
//Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent, ACTIVITY_NATIVE_CAMERA_AQUIRE);
Na onActivityResult()
metody używam BitmapFactory.decodeStream()
do odbioru obrazu.
Kiedy uruchamiam moją aplikację na Nexusie One, działa dobrze. Ale kiedy uruchomię na Samsungu Galaxy S lub HTC Inspire 4G, kierunek obrazu jest nieprawidłowy.
- Przechwytuj w trybie portretowym, rzeczywisty obraz (zapisz na karcie SD) zawsze obraca się o 90 stopni.
Podgląd obrazu po zdjęciu --------- Rzeczywisty obraz na karcie SD
- Rób zdjęcia w trybie poziomym, wszystko jest w porządku.
Podgląd obrazu po zdjęciu --------- Rzeczywisty obraz na karcie SD
android
orientation
android-camera-intent
Nguyen Minh Binh
źródło
źródło
Odpowiedzi:
Jest tu sporo podobnych tematów i problemów. Ponieważ nie piszesz własnego aparatu, myślę, że sprowadza się to do tego:
Niektóre urządzenia obracają obraz przed zapisaniem, podczas gdy inne po prostu dodają znacznik orientacji w danych exif zdjęcia.
Polecam sprawdzić dane exif zdjęcia i poszukać ich szczególnie
Ponieważ zdjęcie wyświetla się poprawnie w Twojej aplikacji, nie jestem pewien, gdzie jest problem, ale to zdecydowanie powinno skierować Cię na właściwą ścieżkę!
źródło
Właśnie napotkałem ten sam problem i użyłem tego do skorygowania orientacji:
Jeśli szerokość mapy bitowej jest większa niż wysokość, zwracany obraz jest w orientacji poziomej, więc obracam go o 90 stopni.
Mam nadzieję, że pomoże to komukolwiek innemu z tym problemem.
źródło
Potrzebne są dwie rzeczy:
Podgląd aparatu musi być taki sam, jak obrót. Ustaw to przez
camera.setDisplayOrientation(result);
Zapisz zrobione zdjęcie jako podgląd aparatu. Zrób to przez
Camera.Parameters
.Mam nadzieję, że to pomoże.
źródło
parameters.setRotation(result)
, że nie?źródło
Inną opcją jest obrócenie mapy bitowej na ekranie wyników w następujący sposób:
źródło
Mam też taki sam problem z jakimś urządzeniem:
źródło
Spróbuj w ten sposób: statyczny Uri image_uri; statyczna mapa bitowa taken_image = null;
}
źródło
Koniec z sprawdzaniem danych exif zdjęcia. Idź łatwo z Glide .
Google przedstawił nam bibliotekę Image Loader dla Androida opracowaną przez bumptech o nazwie Glide jako bibliotekę zalecaną przez Google. Do tej pory był używany w wielu projektach open source Google, w tym w oficjalnej aplikacji Google I / O 2014.
Np .: Glide.with (kontekst) .load (uri) .into (widok obrazu);
Więcej: https://github.com/bumptech/glide
źródło
Mam nadzieję, że to pomoże !! Dzięki
źródło
Mam nadzieję, że to pomoże. Dzięki!
źródło
Po prostu napotkam ten sam problem, poniższy fragment kodu działa dla mnie:
mam nadzieję, że to pomoże :)
źródło
Spróbuj tego w surfaceChanged callback:
źródło
// kliknięcie przycisku
// metoda onActivityResult
// stwórz ścieżkę do pliku klasy
public class FilePath {
}
źródło
Kod jest funkcjonalnie dla krajobrazu i portretu @frontCameraID = zmienna uzyskała klasyczną metodę dla kamery pokazowej
Metoda uzyskiwania orientacji obrót y w celu zapisania obrazu i orientacji wyświetlania @result = orientacja w widoku podglądu kamery @rotationPicture = obrót niezbędny do prawidłowego zapisania obrazu
Ktoś pyta o kod, proszę powiedz mi.
źródło
dwa rozwiązania One line z wykorzystaniem Picassa i biblioteki ślizgowej
Po spędzeniu wielu czasu z wieloma rozwiązaniami problemu rotacji obrazu w końcu znalazłem dwa proste rozwiązania. Nie musimy wykonywać żadnych dodatkowych prac. Picasso i Glide to potężna biblioteka do obsługi obrazów w Twojej aplikacji. Odczyta dane obrazu EXIF i automatycznie obróci obrazy.
Korzystanie z biblioteki glide https://github.com/bumptech/glide
Korzystanie z biblioteki Picasso https://github.com/square/picasso
źródło