2014-10-17 80 views
0

我有相當討厭的問題。我正在構建一個可以分享照片的應用程序。在你拍攝實際照片的SurfaceView上,分辨率非常好。但是,當我檢索該圖像並使用畢加索將其顯示在ListView中時,該解決方案就成了廢話。像素化是真實的。有什麼我做可怕的錯誤造成這種情況?下面的第一個代碼片段是我實際保存照片的位置,下面的代碼片段是我的適配器中用於listview的getItemView()方法。提前致謝。Android:從最高分辨率的文件中顯示圖像

請注意,您在我的代碼中看到的「照片」變量是我創建的Parse子類,用於更輕鬆地處理與每張照片關聯的數據。我認爲你可以放心地忽略它。

編輯:

相機的SurfaceView: 請注意,我試圖將相機參數設置爲允許的最高品質。不幸的是,當我LOG的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() { 
       } 

      }); 
+1

你檢查與文件瀏覽器,結果呢? – 2014-10-17 01:46:17

+0

是的,我想爲此做出答案,但我想我只是想先確認一下,因爲我沒有看到任何問題,當您嘗試使用picasso顯示它時 – 2014-10-17 01:56:36

+0

@nayoso您已經幫助我確定了問題。問題是我手機的相機本身,還是我設置的相機? – 2014-10-17 02:08:14

回答

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; 
    } 

我希望這個答案會幫助你,如果你對我的回答另一個問題,你可以試着問我的意見:)

+0

非常感謝您的幫助。出於某種原因,將相機設置爲更高的分辨率會阻止保存ParseObject「照片」。當它發生時,我可以查看文件本身,我會報告回來。 – 2014-10-17 14:38:43

相關問題