将水平保存的png旋转为垂直[Android]

时间:2015-10-18 02:45:55

标签: java android rotation android-camera

我有一个应用程序,可以在potrait模式下点击图像并将其保存在带有exyension png的SDCARD中。我在图像上使用了一个额外的叠加,然后保存它。我的图像以横向模式保存。

我尝试使用矩阵,但无法正确解决问题。

代码:此函数从包含所有图像字节数据的数组生成png。

          public void generatePng(byte[][] global) {


              for (int i = 1; i < 25; i++) {
                 // Matrix matrix = new Matrix();
                 // matrix.postRotate();
                  // createa matrix for the manipulation


                  Bitmap cameraBitmap = BitmapFactory.decodeByteArray(global[i], 0, global[i].length);
                  int wid = cameraBitmap.getWidth();
                  int hgt = cameraBitmap.getHeight();

                  Matrix matrix = new Matrix();
                  // resize the bit map
                  // matrix.postScale(scaleWidth, scaleHeight);
                  // rotate the Bitmap
                  matrix.postRotate(45);

                  Bitmap newImage = Bitmap.createBitmap
                          (cameraBitmap,0,0,wid, hgt, matrix,true);

                  Canvas canvas = new Canvas(newImage);

                  canvas.drawBitmap(cameraBitmap, 0f, 0f, null);

                  Drawable drawable = getResources().getDrawable(R.drawable.overlay11);
                 // drawable.
                //  drawable.setBounds(40, 40, drawable.getIntrinsicWidth() + 40, drawable.getIntrinsicHeight() + 40);
                  drawable.setBounds(0, 0, wid, hgt);

                  drawable.draw(canvas);


                  File mediaStorageDir = new File("/sdcard/", "pics");

                  File myImage = new File(mediaStorageDir.getPath() + File.separator + "pic" + glo + ".png");
                  Log.d("naval", "File path :" + myImage);
                  glo++;

                  try {
                      FileOutputStream out = new FileOutputStream(myImage);
                      newImage.compress(Bitmap.CompressFormat.JPEG, 80, out);


                      out.flush();
                      out.close();
                  } catch (FileNotFoundException e) {
                      Log.d("In Saving File", e + "");
                  } catch (IOException e) {
                      Log.d("In Saving File", e + "");
                  }
              }
              counter =0;
             // camera.startPreview();


          }

我认为我使用的叠加层会产生问题。 有两个问题

  1. 我们可以旋转保存的图像而不是保存时。我的图像在景观视图中完美保存。只想将它们旋转到Potrait。
  2. 我正在尝试从所有这些图像中创建一个gif。我们可以旋转一个GIF吗?

2 个答案:

答案 0 :(得分:2)

我建议先使用Bitmap检查ExifInterface的方向。

ExifInterface exif = new ExifInterface(file.getAbsolutePath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);

然后使用Matrix轮换Bitmap

Matrix matrix = new Matrix();

if (orientation == 6) {
matrix.postRotate(90);
} else if (orientation == 3) {
matrix.postRotate(180);
} else if (orientation == 8) {
matrix.postRotate(270);
}

myBitmap = Bitmap.createBitmap(myBitmap, 0, 0, myBitmap.getWidth(), myBitmap.getHeight(), matrix, true);

然后,您最终可以将旋转的Bitmap保存在SD卡中。确保将缩小的位图加载到内存中以避免java.lang.OutOfMemory例外。

答案 1 :(得分:0)

matrix.postRotate(270); 

这很有用。