Android:以最高分辨率显示文件中的图像

时间:2014-10-17 00:54:31

标签: java android image picasso

我有很烦人的问题。我正在构建一个可以分享照片的应用。在SurfaceView上拍摄实际照片,分辨率很高。但是,当我检索该图像并使用Picasso在ListView中显示它时,分辨率变为废话。像素化是真实的。我有什么可怕的错误造成这种情况吗?下面的第一个代码片段是我实际保存照片的位置,下面的代码片段是我的适配器中的listview的getItemView()方法。提前谢谢。

请注意"照片"我在代码中看到的变量是我创建的Parse子类,可以更轻松地处理与每张照片相关的数据。我想你可以放心地忽略它。

编辑:

相机的SurfaceView: 请注意,我尝试将摄像机参数设置为允许的最高质量。不幸的是,当我记录尺寸。宽度和尺寸时,我只能得到176x144左右。有没有办法为支持的相机尺寸本身获得更高的分辨率?

                     camera.setDisplayOrientation(90);
                     Parameters parameters = camera.getParameters();
                     parameters.set("jpeg-quality", 70);

                     parameters.setPictureFormat(ImageFormat.JPEG);
                     List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
                     Size size = sizes.get(Integer.valueOf((sizes.size()-1))); 
                     parameters.setPictureSize(size.width, size.height);
                     camera.setParameters(parameters);
                     camera.setDisplayOrientation(90);

                     List<Size> sizes2 = parameters.getSupportedPreviewSizes();
                     Size size2 = sizes.get(0);

                     parameters.setPreviewSize(size2.width, size2.height);
                     camera.setPreviewDisplay(holder);
                     camera.startPreview();

保存照片:

    // Freeze camera 
    camera.stopPreview();

    // Resize photo 
    Bitmap mealImage = BitmapFactory.decodeByteArray(data, 0, data.length);
    Bitmap mealImageScaled = Bitmap.createScaledBitmap(mealImage, 640, 640, false);

    // Override Android default landscape orientation and save portrait
    Matrix matrix = new Matrix();
    matrix.postRotate(90);
    Bitmap rotatedScaledMealImage = Bitmap.createBitmap(mealImageScaled, 0,
            0, mealImageScaled.getWidth(), mealImageScaled.getHeight(),
            matrix, true);

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    rotatedScaledMealImage.compress(Bitmap.CompressFormat.JPEG, 100, bos);

    byte[] scaledData = bos.toByteArray();

    // Save the scaled image to Parse with the date and time as its file name.
    DateTime currentTime = new DateTime();
    DateTimeFormatter fmt = DateTimeFormat.forPattern("HH MM SS");
    photoFile = new ParseFile(currentTime.toString(fmt), scaledData);
    photo.setPhotoFile(photoFile);

显示它:

    final ParseImageView photoView = holder.photoView;
    ParseFile photoFile = photo.getParseFile("photo");

    Picasso.with(getContext())
            .load(photoFile.getUrl())
            .into(photoView, new Callback() {

                @Override
                public void onError() {
                }

                @Override
                public void onSuccess() {
                }

            });

1 个答案:

答案 0 :(得分:0)

问题不在于毕加索

因为这行代码

parameters.set("jpeg-quality", 70);

和这个

List<Size> sizes2 = parameters.getSupportedPreviewSizes();
Size size2 = sizes.get(0);

设置相机时,您已将质量调低至70%(因为根据Android文档,jpeq质量范围介于0-100之间)

然后您还需要检查相机的大小是否正确,因为您正在使用该代码进行假设

您可以尝试使用此代码,以获得最佳的预览尺寸和优先宽度

private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters){
     Camera.Size bestSize = null;
     List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();

     bestSize = sizeList.get(0);

     for(int i = 1; i < sizeList.size(); i++){
      if((sizeList.get(i).width * sizeList.get(i).height) >
        (bestSize.width * bestSize.height)){
       bestSize = sizeList.get(i);
      }
     }

     return bestSize;
    }

我希望这个答案可以帮到你,如果你对我的答案有另一个问题,你可以试着在评论中问我:)