从json检索后设置图像大小

时间:2015-06-17 05:14:21

标签: java json swing user-interface

我想通过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中显示图像。我想设置图像的大小,因此它必须小于面板大小。我怎么能实现这个????

2 个答案:

答案 0 :(得分:1)

如果您不关心结果的质量,可以使用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,这将允许图像占据大面积然后可用,或者您需要一个动态面板,可以根据可用空间自动调整图像大小,但您仍需要确定&#34;默认&#34;或&#34;首选&#34;大小应该是

答案 1 :(得分:0)

试试这个:

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