in surface preview (portrait) everything is fine, but once you save the image it turns out it is stored rotated on 90 degrees. what the heck?!
it seems a huge problem with some phones and checking some groups, android team has no intention to fix this, claiming it is manufacturer problem. ok.
there are many useful discussions on stackoverflow.com (of course) with different suggestions. some of them quite ugly. i tried to go with the one to rotate the image back before saving, but then you cannot do this in every case because in landscape everything seems to work fine...grrrr...
ok, first lets see how may we know what mode we're in (landscape/portrait)
again a bunch of hacks and solutions...
- "width>heigh? you're landscape"
- check in mode the file itself was saved via exifinterface:
exif = new ExifInterface(file.getAbsolutePath());
- blah blah blah
here's the one that works for me:
Configuration newConfig = parentActivity.getResources().getConfiguration();so how do we use this info?
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Log.v(LOG_TAG, "detected landscape mode");
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
Log.v(LOG_TAG, "portrait mode detected");
}
rotate!
now if we rotate the camera (and we're sure we're in the bloody portrait) will it save what is sees correctly? Noooooooooooo, the images is again rotated incorectly
ok, so lets rotate the image as well then
but here is another darn problem; "Out Of Memory" exceptions - first we get the byte[] of the image, then we create a bitmap out of it, and then try to rotate with a Matrix. well, you can't - BOoooM!
at least on my humble device
so you have to come up with some trick i guess
using square's excellent picasso wouldn't do the trick because even if it may rotate the image when it loads it, it cannot save it rotated back to storage.
wait a second, did you say "rotate the image when it loads it"?
so here is how we can trick the trickster - rotate the image on loading!
but we have to know if the image even has to be rotated, what if it has been saved in landscape mode and all is good? do we have to, like, open the file and read some information from it? blah...
well - there is an easier way - just give the file such a name that you'll know it has to be rotated when loaded, then it gets as easy as PI:
if (filename.contains("MUSTBEROTATED")) {
Picasso.with(activity.this.getApplicationContext()) //
.load(new File(filename)) //
.rotate(90f)
.resize(screenWidth, screenHeight)
.centerInside()
.into(imageView);
}
else {
Picasso.with(activity.this.getApplicationContext()) //
.load(new File(filename)) //
.resize(screenWidth, screenHeight)
.centerInside()
.into(imageView);
}
and thats about it i guess
what remains to be seen is how this will work on devices that do not have this portrait nightmare problem...probably doesn't...so much for hacking glory...
1 comment :
And where do you suppose to run: Configuration newConfig = parentActivity.getResources().getConfiguration(); if camera is launched via intent?
Post a Comment