我将位图存储在SD卡中,同时检索丢失质量。我怎么能解决这个问题。下面是我在Sd卡中存储位图的代码。
public void saveExternalPrivateStorage(File folderDir, String fname,
Bitmap bitmap) {
File file = new File(folderDir, fname);
if (file.exists()) {
file.delete();
}
if ((folderDir.mkdirs() || folderDir.isDirectory())) {
try {
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 0, out);
out.flush();
out.close();
System.out.println("Stored");
System.out.println(file.getAbsolutePath());
System.out.println("Stored");
} catch (Exception e) {
e.printStackTrace();
}
}
}
调用此方法:
File folderDir= new File(getActivity().getExternalFilesDir("myfolder"),"/images");
storeImagesIndevices.saveExternalPrivateStorage(folderDir,filename,imgBitmapUrls.get(i));
从SD卡取回:
Bitmap bitmap2 = BitmapFactory.decodeFile(folderDir+"/"+data.getTid());
dbimgBitmapUrls.put(data.get_tid()-1, bitmap2);
答案 0 :(得分:3)
bitmap.compress(Bitmap.CompressFormat.JPEG, 0, out);
JPEG是一种有损压缩格式,您将0%设置为质量参数。大约70%的东西通常是文件大小和图像质量之间的良好折衷:
bitmap.compress(Bitmap.CompressFormat.JPEG, 70, out);
或者使用无质量格式,例如PNG,其中质量参数无关紧要:
bitmap.compress(Bitmap.CompressFormat.PNG, 0, out);
可以在SQLite中存储位图吗?这是好方法。在我的情况下,图像数量不是那么多
你可以,但你不应该。更好的方法是将图像存储为文件,并将路径存储在数据库中。
答案 1 :(得分:3)
您应该使用更高的压缩质量:
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
compress
的第二个参数是0-100数字,表示质量和文件大小之间的权衡:
可能你会想要一个中间值,只需稍微玩一下,直到你找到一个满意的应用价值。另请参阅compress()
javadoc。
如果是这种情况,您还可以使用无损格式(如PNG)而不是JPEG。