【问题标题】:How to get ImageView image size (Android)如何获取 ImageView 图像大小(Android)
【发布时间】:2014-11-28 20:04:02
【问题描述】:

我正在开发一个图片库应用程序,在该应用程序中我从互联网加载图像,并在单击按钮时将图像保存到 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 或字节)

【问题讨论】:

  • 使用 ImageView 的图库应用?那只能包含一张图片。您将使用 GridView 或我认为的类似的东西。图像怎么会在 ImageView 中?
  • 现在你只是那个形象。它总是有相同的名字。 (图像.jpeg)。您可以开始调整您的代码,首先确定文件长度,然后使用伪代码确定新文件的大小并确定是否要删除和/或保存。
  • 但是,只有先将其保存为不同的名称,然后比较两个文件大小,您才可以使用文件大小来执行此操作。但是,这仍然不是按照您的意愿进行操作的好方法。
  • GridView + 全屏 ImageView。从 GridView 中选择的图像发送到全屏 ImageView
  • 从 gridview 发送到 full imageview 的内容是什么?位图?还是文件路径?

标签: android android-imageview android-image


【解决方案1】:

您可以使用 File 的 length() 方法。喜欢:

long size = yourFile.length();

JavaDocs:

返回此抽象路径名表示的文件的长度。如果此路径名表示目录,则返回值未指定。

但我强烈建议使用哈希值而不是文件大小。

【讨论】:

  • 使用了这个但不起作用:long size = fullImageView.length();
  • fullImageView 是什么样的对象?因为您在示例中使用了 .getWidth() :S
【解决方案2】:

不要使用图片大小作为相似度的验证。 而是比较图像。最简单的方法是遍历每个 像素并比较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 回答!

对不起,我的英语和问候,史蒂夫。

【讨论】:

  • 他不能做到有 1000 个 jpg 文件要检查。只考虑它将花费的时间。并且 .jpg 必须转换回位图,并且不等于原始位图。
  • 他当然可以。他只想比较应该保存的图像。而且,为了澄清起见,请告诉我图像处理库是如何进行这种比较的,如果不是通过像素迭代。
  • He want's to compare only images that should be saved。不,他想将未保存的位图与许多 jpg 文件进行比较。好吧,无论如何你都建议这样做。
  • 我就是这么说的。未保存的图像(应保存的图像)。但是,感谢您的提示,我编辑了我的答案。
  • guys just help me with getting image size from imageview。那是不可能的。如果您将其保存为位图,您可以确定文件大小。但是,如果您有更多具有相同分辨率的图像,那么所有图像都将具有相同的文件大小。所以请回答我的问题。你需要一种不同的方法来获得你想要的东西。
猜你喜欢
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 2018-01-24
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多