wie man eine Bitmap um 90 Grad dreht

Es gibt eine statement in android canvas.drawBitmap(visiblePage, 0, 0, paint);

Wenn ich canvas.rotate(90) hinzufüge, gibt es keinen Effekt. Aber wenn ich schreibe

 canvas.rotate(90) canvas.drawBitmap(visiblePage, 0, 0, paint); 

Ich bekomme keine Bitmap gezeichnet. Also, was mache ich nicht richtig?

Sie können dieses auch versuchen

 Matrix matrix = new Matrix(); matrix.postRotate(90); Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmapOrg, width, height, true); Bitmap rotatedBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true); 

Dann können Sie das gedrehte Bild verwenden, um in Ihrer Bildansicht durch zu setzen

 imageView.setImageBitmap(rotatedBitmap); 
 public static Bitmap RotateBitmap(Bitmap source, float angle) { Matrix matrix = new Matrix(); matrix.postRotate(angle); return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); } 

So erhalten Sie Bitmap von Ressourcen:

 Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.your_img); 

Unten ist der Code, um dein Bild in Android zu drehen oder neu zu sortieren

 public class bitmaptest extends Activity { @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); LinearLayout linLayout = new LinearLayout(this); // load the origial BitMap (500 x 500 px) Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), R.drawable.android); int width = bitmapOrg.width(); int height = bitmapOrg.height(); int newWidth = 200; int newHeight = 200; // calculate the scale - in this case = 0.4f float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // createa matrix for the manipulation Matrix matrix = new Matrix(); // resize the bit map matrix.postScale(scaleWidth, scaleHeight); // rotate the Bitmap matrix.postRotate(45); // recreate the new Bitmap Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true); // make a Drawable from Bitmap to allow to set the BitMap // to the ImageView, ImageButton or what ever BitmapDrawable bmd = new BitmapDrawable(resizedBitmap); ImageView imageView = new ImageView(this); // set the Drawable on the ImageView imageView.setImageDrawable(bmd); // center the Image imageView.setScaleType(ScaleType.CENTER); // add ImageView to the Layout linLayout.addView(imageView, new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT ) ); // set LinearLayout as ContentView setContentView(linLayout); } } 

Sie können diesen Link auch für Details überprüfen: http://www.anddev.org/resize_and_rotate_image_-_example-t621.html

Kurze Verlängerung für Kotlin

 fun Bitmap.rotate(degrees: Float): Bitmap { val matrix = Matrix().apply { postRotate(degrees) } return Bitmap.createBitmap(this, 0, 0, width, height, matrix, true) } 

Und Verwendung:

 val rotatedBitmap = bitmap.rotate(90) 

Standardmäßig ist der Drehpunkt der Punkt des Canvas (0,0), und ich vermute, dass Sie ihn vielleicht um das Zentrum drehen möchten. Ich habe das gemacht:

 protected void renderImage(Canvas canvas) { Rect dest,drawRect ; drawRect = new Rect(0,0, mImage.getWidth(), mImage.getHeight()); dest = new Rect((int) (canvas.getWidth() / 2 - mImage.getWidth() * mImageResize / 2), // left (int) (canvas.getHeight()/ 2 - mImage.getHeight()* mImageResize / 2), // top (int) (canvas.getWidth() / 2 + mImage.getWidth() * mImageResize / 2), //right (int) (canvas.getWidth() / 2 + mImage.getHeight()* mImageResize / 2));// bottom if(!mRotate) { canvas.drawBitmap(mImage, drawRect, dest, null); } else { canvas.save(Canvas.MATRIX_SAVE_FLAG); //Saving the canvas and later restoring it so only this image will be rotated. canvas.rotate(90,canvas.getWidth() / 2, canvas.getHeight()/ 2); canvas.drawBitmap(mImage, drawRect, dest, null); canvas.restore(); } } 

Wenn Sie Bitmap drehen, ist 90 180 270 360 in Ordnung, aber für andere Grad wird Canvas Bitmap mit unterschiedlicher Größe zeichnen.

Also, der beste Weg ist

 canvas.rotate(degree,rotateCenterPoint.x,rotateCenterPoint.y); canvas.drawBitmap(...); canvas.rotate(-degree,rotateCenterPoint.x,rotateCenterPoint.y);//rotate back 

Wenn Sie ein gedrehtes Bild in einer Bildansicht oder Datei haben möchten, können Sie Exif verwenden, um das zu erreichen. Die Support-Bibliothek bietet nun Folgendes an: https://android-developers.googleblog.com/2016/12/introducing-the-exifinterface-support-library.html

Unten ist seine Verwendung, aber um Ihr Ziel zu erreichen, müssen Sie die Bibliothek API Dokumentation dafür überprüfen. Ich wollte nur einen Hinweis geben, dass das Drehen der Bitmap nicht immer der beste Weg ist.

 Uri uri; // the URI you've received from the other app InputStream in; try { in = getContentResolver().openInputStream(uri); ExifInterface exifInterface = new ExifInterface(in); // Now you can extract any Exif tag you want // Assuming the image is a JPEG or supported raw format } catch (IOException e) { // Handle any errors } finally { if (in != null) { try { in.close(); } catch (IOException ignored) {} } } int rotation = 0; int orientation = exifInterface.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: rotation = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: rotation = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: rotation = 270; break; } 

Abhängigkeit

kompiliere “com.android.support:exifinterface:25.1.0”