【问题标题】:set size of image after retrieving from json从 json 检索后设置图像的大小
【发布时间】:2015-09-02 04:04:58
【问题描述】:

我想设置通过 json 服务获取的图像大小。 ???

这是我的代码

public void getImage(){
 try {

        URL url = new URL("https://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=good%20idea%20good%20idea%20water%20jug%20water%20jug%20thirsty%20crow%20thirsty%20crow%20long%20time%20long%20time%20jug%20jug");
        URLConnection connection = url.openConnection();
        String line;
        StringBuilder builder = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        while ((line = reader.readLine()) != null) {
            builder.append(line);
        }
        JSONObject json = new JSONObject(builder.toString());
        String imageUrl = json.getJSONObject("responseData").getJSONArray("results").getJSONObject(0).getString("url");

        BufferedImage image = ImageIO.read(new URL(imageUrl));

        ImageIcon img = new ImageIcon(image);
        JLabel label = new JLabel("", img, JLabel.CENTER);

        jPanel1.add( label, BorderLayout.CENTER );


    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e.getMessage(), "Failure", JOptionPane.ERROR_MESSAGE);
        e.printStackTrace();
    }     
}

我在 jPanel 中显示图像。我想设置图像的大小,因此它必须小于面板大小。我怎么能做到这一点????

【问题讨论】:

  • 您遇到了第 22 条问题,面板的大小通常由内容的大小(在这种情况下为图像)决定,也许像 this 这样的东西可能会有所帮助。这是一个JPanel,它可以绘制图像,但它会缩放图像以使其“适合”其中
  • 我已经尝试过代码 [this]stackoverflow.com/questions/18053310/…> 我不需要图像是可拉伸的,所以我根据我的需要更新/更改了我的代码,但是找不到这有帮助。这是一个很好的工作,但我觉得这没有帮助。那么是否有任何方法通过直接指定宽度,高度到json图像来改变图像的大小。
  • BufferedImage#getScaledInstance - 但是我必须将您指向The Perils of Image.getScaledInstance()。您也可以查看imgscalr,但正如我所说,您可能遇到了第 22 条问题,事实上面板的大小通常取决于其内容的大小(JLabel 和图像) .我发布的第一个链接还缩放图像,同时保持其纵横比

标签: java json swing user-interface


【解决方案1】:

试试这个:

resized = Bitmap.createScaledBitmap(yourBitmap,(int)(yourBitmap.getWidth()*0.8), (int)(yourBitmap.getHeight()*0.8), true);

【讨论】:

  • 这是Android API吗?
  • ImageIcon img = new ImageIcon(image) 我从 JSON 获取图像,它是 ImageIcon 类型的。上面的代码图像类型是 Bitmap 不工作
  • 不,它不是 Android API。它是 Google API AJAX 服务。它将调用 JSON fromat 中的图像结果。查看 This 。在 JSON 数据 /URL 正文中提供图片 urljsonformatter.curiousconcept.com>
  • BitMap 不是 Java API 的标准类,是 Google 库的一部分吗?我只在 Android API 中看到过
  • 好的。回到我的问题。我从 google ajax api 获取 JSON 格式的图像 如何设置该图像的宽度和高度?
【解决方案2】:

如果你不关心结果的质量,你可以使用Image#getScaledInstance,但你应该先阅读The Perils of Image.getScaledInstance()

Image scaled = image.getScaledInstance(jPanel1.getWidth(), jPanel1.getHeight(), Image.SCALE_SMOOTH);

但这不会保持图像的纵横比,要做到这一点,您必须决定哪个维度更重要

int width = jPanel1.getWidth();
int height = jPanel1.getHeight();
if (width < height) {
    height = -1;
} else {
    width = -1;
}
Image scaled = image.getScaledInstance(width, height, Image.SCALE_SMOOTH);

查看Java: maintaining aspect ratio of JPanel background image了解更多详情

现在,如果您确实关心生成图像的质量,那么您需要使用不同的缩放方法,您可以使用分而治之的方法,如 Quality of Image after resize very low -- Java 中所示,或者使用第 3 方库,比如ImgSclr

现在,您的下一个问题是,组件的大小通常是根据其子项的需求来计算的。在这种情况下,这意味着jPanel1 可能想要使用JLabel 的大小来确定它应该有多大。同样,JLabel 将使用图像的大小来确定它应该有多大。这会让您遇到第 22 条问题。

您可以使用JScrollPane,这将允许图像占据较大的区域然后可用,或者您需要一个动态面板,可以根据可用空间自动调整图像大小,但您仍然需要制作确定“默认”或“首选”大小应该是什么

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2017-05-30
    • 2020-08-29
    相关资源
    最近更新 更多