Andorid fejlesztés – Képek orientációnak megfelelő megjelenítése

írta: Sianis, 12 éve

Hoztam nektek egy kis okosságot. Az a probléma, hogy Androidon a kamerával készített képek nem mindig helyesen forgatva jelennek meg. Tehát ha a kép fekvő módban lett készítve, akkor álló módban nézve elfordítva jelenhet meg, illetve van olyan készülék ami az álló módban készített képeket is úgy mutatja, mint ami fekvőben készült. Ez készülékenként teljesen kiszámíthatatlan. Megoldás, forgassuk a képet mindig jó irányba, ne bízzunk a kamerában!

Alábbi kód megadja, hogy a path útvonalon lévő képfájl milyen orientációban készült.

public static int getAngleForImage(String path) {
int angle = 0;
try {
ExifInterface exif = new ExifInterface(path);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);

if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
angle = 90;
}
else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
angle = 180;
}
else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
angle = 270;
}
} catch (Exception e) {

}
return angle;
}

Használata kódban:

Matrix mat = new Matrix();
mat.postRotate(Util.getAngleForImage(imageFile.getAbsolutePath()));

Fenti kóddal készítettünk egy Matrix példányt ami a forgatást elvégzi majd. Az imageFile a képfájlra mutató File példány, mivel másra is használom, ezért nem csak sima String. Ezzel viszont még nincs vége, valahogy rá kell húzni ezt a képre:

Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath(), options);

Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), mat, true);
mImageView.setImageBitmap(rotatedBitmap);

bitmap példányba kerül az eredeti kép, az options pár beállítás, mivel szeretem olyan sample sizeban kérni a képet ami a kijelzőnek megfelel. Bővebben erről: [link]

Ezután csinálunk egy másik Bitmap példányt amihez az eredetit használjuk, de alkalmazzuk rá a mátrixműveleteit is.

Eredményét pedig beadjuk az ImageView-nak, ahol már jó irányban meg a kép.

Tesztelve:
- ZTE Blade
- Samsung Galaxy Nexus
- Samsung Galaxy 3