当前位置: 首页 > 知识库问答 >
问题:

从相机拍摄的图像旋转

薛涛
2023-03-14

在我的应用程序中,用户从相机捕获图像或从图库中选择图像,然后将其转换为pdf并上载到服务器,现在我的问题是,从相机捕获的图像在某些设备上旋转,我有代码尝试解决此问题,但它不起作用

 private void PDFCreation(){
        PdfDocument document=new PdfDocument();
        PdfDocument.PageInfo pageInfo;
        PdfDocument.Page page;
        Canvas canvas;
        int i;
        for (i=0; i < list.size(); i++)  {
            pageInfo=new PdfDocument.PageInfo.Builder(992, 1432, 1).create();
            page=document.startPage(pageInfo);
            canvas=page.getCanvas();
            image=BitmapFactory.decodeFile(list.get(i));
            image=Bitmap.createScaledBitmap(image, 980, 1420, true);
            image.setDensity(DisplayMetrics.DENSITY_300);
            canvas.setDensity(DisplayMetrics.DENSITY_300);
            canvas.drawBitmap(image, 0, 0, null);
            float rotation=0;
            try {
                ExifInterface exifInterface=new ExifInterface(selectedPhoto);
                int orientation=exifInterface.getAttributeInt(TAG_ORIENTATION, ORIENTATION_NORMAL);
                switch (orientation) {
                    case ExifInterface.ORIENTATION_ROTATE_90: {
                        rotation=-90f;
                        break;
                    }
                    case ExifInterface.ORIENTATION_ROTATE_180: {
                        rotation=-180f;
                        break;
                    }
                    case ExifInterface.ORIENTATION_ROTATE_270: {
                        rotation=90f;
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            canvas.rotate(rotation);
            document.finishPage(page);
        }
        @SuppressWarnings("deprecation") String directory_path=Environment.getExternalStorageDirectory().getPath() + "/mypdf/";
        File file=new File(directory_path);
        if (!file.exists()) {
            //noinspection ResultOfMethodCallIgnored
            file.mkdirs();
        }
        @SuppressLint("SimpleDateFormat") String timeStamp=(new SimpleDateFormat("yyyyMMdd_HHmmss")).format(new Date());
        String targetPdf=directory_path + timeStamp + ".pdf";
         filePath=new File(targetPdf);
        try {
            document.writeTo(new FileOutputStream(filePath));
        } catch (IOException e) {
            Log.e("main", "error " + e.toString());
            Toasty.error(this, "Error making PDF" + e.toString(), Toast.LENGTH_LONG).show();
        }
        document.close();

任何建议或问题在哪里,没有错误代码或任何东西

共有1个答案

谷梁永年
2023-03-14

绘制位图后不能旋转画布。你必须先旋转它,然后使用绘制位图即

        float rotation=0;
        try {
            ExifInterface exifInterface=new ExifInterface(selectedPhoto);
            int orientation=exifInterface.getAttributeInt(TAG_ORIENTATION, ORIENTATION_NORMAL);
            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90: {
                    rotation=-90f;
                    break;
                }
                case ExifInterface.ORIENTATION_ROTATE_180: {
                    rotation=-180f;
                    break;
                }
                case ExifInterface.ORIENTATION_ROTATE_270: {
                    rotation=90f;
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        canvas.save();
        canvas.rotate(rotation);

        //canvas is rotated now use drawBitmap
        canvas.drawBitmap(image, 0, 0, null);
        canvas.restore();
 类似资料:
  • 所以我遇到了一个问题,前面在我提问的问题中提到过:将图像(ACTION_image_CAPTURE)上载到Firebase存储 我对这个问题进行了更多的搜索,并应用了Android Studio文档:https://developer.android.com/training/camera/photobasics.html#TaskPhotoView 所以,在您阅读代码之前,我基本上想说一下需要什

  • 我有一个问题。当我试图从相机上拍照时,质量很低。首先,使用摄像头捕捉图片,然后保存到目录中,同时获取图片并显示在我的应用程序中。保存在目录中的图片质量很好,但当我从目录中获取时,质量很低。下面是我的示例代码: 任何解决方案/建议?谢谢:) 解决了的 当我遵循下面Antrromet给出的代码时,问题解决了

  • 我必须做一个按钮,将提供从画廊或从相机选择图像。 结果是有效的。如果我从图库中选择,图像查看器将查看它,如果我选择从相机拍照,它也有效。问题是,在我的show FileChooser()方法中,我所有的意图都在同时运行,所以当我从图库中选择时,相机仍然运行。我选择相机,图库也在打开。我认为我应该在切换案例模式下实现我的代码,但我不明白如何做到这一点。请帮助解决我的初学者问题。

  • 我正在开发一个应用程序,在这个应用程序中,我以纵向方向拍摄照片,问题是当我稍后检索图像时,它是横向方向的(图片已逆时针旋转90度)。我曾经在课下使用过,但这里每次都是0(零)。所以,我不知道怎么解决它。

  • 我试图控制Android相机在肖像应用程序中拍照,但是当我保存照片时,它是在风景中。我已经旋转图像90级与方法,但不工作。 然后我找到了这篇文章,但是是(未定义)。如果我抓住这个值并应用旋转值,也不起作用。 我如何在肖像中拍摄照片,并以良好的方向保存它?

  • 我一直在开发一个摄像头应用程序,所有的工作都是拍摄和保存照片。但我希望在拍摄照片时显示的Imageview能够保存在实际拍摄的照片中。可能吗? 现在,我一直试图让图像视图与我绘制相机预览的布局相同。 我想,也许如果它画在与相机相同的视图上,那么它也会看到图像和照片。 有没有人知道这是否可能,或者我必须采取另一种方法?如果是这样,链接到其他解决方案如何做到这一点将不胜感激:) 谢谢 编辑:我一直遵循