La transformación de la imagen (rotación, ampliación y sesgado) lo puedes realizar con Matrix:
Matrix matrix = new Matrix();
matrix.postRotate(90.0);
Bitmap imageBitmapNuevo = Bitmap.createBitmap(imageBitmap, 0, 0, imageBitmap.getWidth(), imageBitmap.getHeight(), matrix, true);
Tendrás que detectar si la imagen ha sido tomada rotada o no para tomar una decisión, para ello puedes utilizar los metadatos en formato EXIF de la imagen con ExifInterface con algo así:
Uri uri = getImageUri(getApplicationContext(), imageBitmap);
File file = new File(getRealPathFromURI(uri));
ExifInterface ei = new ExifInterface(file);
int orientacion = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
Matrix matrix = new Matrix();
switch(orientacion) {
case ExifInterface.ORIENTATION_ROTATE_90:
matrix.postRotate(90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix.postRotate(180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix.postRotate(270);
break;
}
Bitmap imageBitmapNuevo = Bitmap.createBitmap(imageBitmap, 0, 0, imageBitmap.getWidth(), imageBitmap.getHeight(), matrix, true);