我正在开发一个图片库应用程序,我在其中加载来自互联网的图像,我在按钮点击时将图像保存到SD卡。
现在我想要的是我想获得ImageView中加载的图像的大小。我想以KB /字节为单位获取图像大小。
我想使用图像大小来防止重复保存和替换图像。
这是我用来保存图片的代码: 相同分辨率的图像被替换
int intHeight = fullImageView.getHeight();
int intWidth = fullImageView.getWidth();
String dirname2 = "/Wallpapers/";
File myDir2 = new File(Environment.getExternalStorageDirectory()
.getPath() + dirname2);
myDir2.mkdirs();
String fname2 = "image" + intHeight + intWidth +".jpeg";
File file2 = new File(myDir2, fname2);
if (file2.exists())
file2.delete();
try {
FileOutputStream out = new FileOutputStream(file2);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
Toast.makeText(_context, "failed", Toast.LENGTH_SHORT).show();
}
请注意:我问的是KB或字节的图像大小
答案 0 :(得分:1)
不要将图像尺寸用作相似性的验证。 而是比较图像。最简单的方法是迭代每一个 像素并比较RGB值。但这只会给你一个有效的答案 如果图像真的是100%相等。如果你想检测相似性 根据图像,不论分辨率如何,你应该搜索一个图书馆 比较图像。
edit2:如前所述,按照结构“比较”图片需要一段时间。 在这种情况下,我建议将url,name和etag存储在数据库中 如果要保存图像,请通过UUID保存图像并进行数据库查找(快速)。 但是不要重新发明轮子。只需使用一个库 能够处理这种图像存储。我推荐Picasso
编辑:我可以为您提供像素迭代的示例代码。随意加强它:
public static void iterateOverImage(BufferedImage image){
int currentColor;
for(int x = 0; x < widthInPx; x++){
for(int y = 0; y < heightInPx; y++){
currentColor = image.getRGB(x, y);
//do something with it (i.e comparison)
}
}
}
<强> EDIT3:强>
public int sizeInByte() {
try {
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(b);
o.writeObject(yourObject);
o.flush();
o.close();
return b.length;
} catch (IOException e) {
ExceptionHandler.logAndSendException(e);
}
return -1;
}
并且cgew85回答!
对不起我的英语和问候,史蒂夫。
答案 1 :(得分:1)
您可以使用File的length()方法。像:
long size = yourFile.length();
的JavaDoc:
返回此抽象路径名表示的文件的长度。如果此路径名表示目录,则返回值未指定。
但是我强烈建议使用哈希值而不是文件大小。