2014-10-17 74 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