[英]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.