簡體   English   中英

Android:以最高分辨率顯示文件中的圖像

[英]Android: Display image from file in highest resolution

我有一個很煩人的問題。 我正在構建一個可以共享照片的應用程序。 在您拍攝實際照片的SurfaceView上,分辨率非常好。 但是,當我檢索該圖像並使用Picasso將其顯示在ListView中時,分辨率降低了。 像素化是真實的。 我做錯什么了嗎? 下面的第一個代碼段是我實際保存照片的位置,下面的代碼段是我的listview適配器中的getItemView()方法。 提前致謝。

請注意,您在代碼中看到的“照片”變量是我創建的一個Parse子類,它使與每張照片相關的數據的使用變得更加容易。 我認為您可以放心地忽略它。

編輯:

相機的SurfaceView:請注意,我嘗試將相機參數設置為允許的最高質量。 不幸的是,當我記錄size.width和size.height時,我只能得到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() {
                }

            });

問題不在於畢加索

因為這行代碼

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

和這個

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

設置相機時,您已經將畫質降低到70%(由於基於Android文檔,jpeq-quality的范圍在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;
    }

希望這個答案對您有幫助,如果您對我的答案還有其他疑問,可以嘗試在評論中問我:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM