我有很烦人的问题。我正在构建一个可以分享照片的应用。在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() {
}
});
答案 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;
}
我希望这个答案可以帮到你,如果你对我的答案有另一个问题,你可以试着在评论中问我:)