这是一个棘手的问题。您强调了使用JLabel显示图像的事实,这是标准的处理方式,但是,JLabel是一个复杂的小野兽,具有文本,图标和文本对齐和定位。

如果您不需要所有额外功能,我只需创建一个能够绘制缩放图像的自定义组件……

接下来的问题是,您想如何缩放图像?你想保持图像的宽高比吗?您想要将图像“适合”或“填充”到可用空间。

@David是对的。在可能的情况下,您应该避免使用Image#getScaledInstance,因为它不是最快的,但更重要的是,它通常也不能提供最高质量。

Fit vs Fill

以下示例相当简单(并且从我的代码库中借用了很多,所以它可能也有点复杂;))。它可以使用背景缩放线程,但我会根据原始图像的潜在大小做出决定。

public class ResizableImage {

public static void main(String[] args) {

new ResizableImage();

}

public ResizableImage() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException ex) {

} catch (InstantiationException ex) {

} catch (IllegalAccessException ex) {

} catch (UnsupportedLookAndFeelException ex) {

}

try {

BufferedImage image = ImageIO.read(new File("/path/to/your/image"));

JFrame frame = new JFrame("Test");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLayout(new BorderLayout());

frame.add(new ScalablePane(image));

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

} catch (Exception exp) {

exp.printStackTrace();

}

}

});

}

public class ScalablePane extends JPanel {

private Image master;

private boolean toFit;

private Image scaled;

public ScalablePane(Image master) {

this(master, true);

}

public ScalablePane(Image master, boolean toFit) {

this.master = master;

setToFit(toFit);

}

@Override

public Dimension getPreferredSize() {

return master == null ? super.getPreferredSize() : new Dimension(master.getWidth(this), master.getHeight(this));

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Image toDraw = null;

if (scaled != null) {

toDraw = scaled;

} else if (master != null) {

toDraw = master;

}

if (toDraw != null) {

int x = (getWidth() - toDraw.getWidth(this)) / 2;

int y = (getHeight() - toDraw.getHeight(this)) / 2;

g.drawImage(toDraw, x, y, this);

}

}

@Override

public void invalidate() {

generateScaledInstance();

super.invalidate();

}

public boolean isToFit() {

return toFit;

}

public void setToFit(boolean value) {

if (value != toFit) {

toFit = value;

invalidate();

}

}

protected void generateScaledInstance() {

scaled = null;

if (isToFit()) {

scaled = getScaledInstanceToFit(master, getSize());

} else {

scaled = getScaledInstanceToFill(master, getSize());

}

}

protected BufferedImage toBufferedImage(Image master) {

Dimension masterSize = new Dimension(master.getWidth(this), master.getHeight(this));

BufferedImage image = createCompatibleImage(masterSize);

Graphics2D g2d = image.createGraphics();

g2d.drawImage(master, 0, 0, this);

g2d.dispose();

return image;

}

public Image getScaledInstanceToFit(Image master, Dimension size) {

Dimension masterSize = new Dimension(master.getWidth(this), master.getHeight(this));

return getScaledInstance(

toBufferedImage(master),

getScaleFactorToFit(masterSize, size),

RenderingHints.VALUE_INTERPOLATION_BILINEAR,

true);

}

public Image getScaledInstanceToFill(Image master, Dimension size) {

Dimension masterSize = new Dimension(master.getWidth(this), master.getHeight(this));

return getScaledInstance(

toBufferedImage(master),

getScaleFactorToFill(masterSize, size),

RenderingHints.VALUE_INTERPOLATION_BILINEAR,

true);

}

public Dimension getSizeToFit(Dimension original, Dimension toFit) {

double factor = getScaleFactorToFit(original, toFit);

Dimension size = new Dimension(original);

size.width *= factor;

size.height *= factor;

return size;

}

public Dimension getSizeToFill(Dimension original, Dimension toFit) {

double factor = getScaleFactorToFill(original, toFit);

Dimension size = new Dimension(original);

size.width *= factor;

size.height *= factor;

return size;

}

public double getScaleFactor(int iMasterSize, int iTargetSize) {

return (double) iTargetSize / (double) iMasterSize;

}

public double getScaleFactorToFit(Dimension original, Dimension toFit) {

double dScale = 1d;

if (original != null && toFit != null) {

double dScaleWidth = getScaleFactor(original.width, toFit.width);

double dScaleHeight = getScaleFactor(original.height, toFit.height);

dScale = Math.min(dScaleHeight, dScaleWidth);

}

return dScale;

}

public double getScaleFactorToFill(Dimension masterSize, Dimension targetSize) {

double dScaleWidth = getScaleFactor(masterSize.width, targetSize.width);

double dScaleHeight = getScaleFactor(masterSize.height, targetSize.height);

return Math.max(dScaleHeight, dScaleWidth);

}

public BufferedImage createCompatibleImage(Dimension size) {

return createCompatibleImage(size.width, size.height);

}

public BufferedImage createCompatibleImage(int width, int height) {

GraphicsConfiguration gc = getGraphicsConfiguration();

if (gc == null) {

gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();

}

BufferedImage image = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);

image.coerceData(true);

return image;

}

protected BufferedImage getScaledInstance(BufferedImage img, double dScaleFactor, Object hint, boolean bHighQuality) {

BufferedImage imgScale = img;

int iImageWidth = (int) Math.round(img.getWidth() * dScaleFactor);

int iImageHeight = (int) Math.round(img.getHeight() * dScaleFactor);

if (dScaleFactor <= 1.0d) {

imgScale = getScaledDownInstance(img, iImageWidth, iImageHeight, hint, bHighQuality);

} else {

imgScale = getScaledUpInstance(img, iImageWidth, iImageHeight, hint, bHighQuality);

}

return imgScale;

}

protected BufferedImage getScaledDownInstance(BufferedImage img,

int targetWidth,

int targetHeight,

Object hint,

boolean higherQuality) {

int type = (img.getTransparency() == Transparency.OPAQUE)

? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;

BufferedImage ret = (BufferedImage) img;

if (targetHeight > 0 || targetWidth > 0) {

int w, h;

if (higherQuality) {

// Use multi-step technique: start with original size, then

// scale down in multiple passes with drawImage()

// until the target size is reached

w = img.getWidth();

h = img.getHeight();

} else {

// Use one-step technique: scale directly from original

// size to target size with a single drawImage() call

w = targetWidth;

h = targetHeight;

}

do {

if (higherQuality && w > targetWidth) {

w /= 2;

if (w < targetWidth) {

w = targetWidth;

}

}

if (higherQuality && h > targetHeight) {

h /= 2;

if (h < targetHeight) {

h = targetHeight;

}

}

BufferedImage tmp = new BufferedImage(Math.max(w, 1), Math.max(h, 1), type);

Graphics2D g2 = tmp.createGraphics();

g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);

g2.drawImage(ret, 0, 0, w, h, null);

g2.dispose();

ret = tmp;

} while (w != targetWidth || h != targetHeight);

} else {

ret = new BufferedImage(1, 1, type);

}

return ret;

}

protected BufferedImage getScaledUpInstance(BufferedImage img,

int targetWidth,

int targetHeight,

Object hint,

boolean higherQuality) {

int type = BufferedImage.TYPE_INT_ARGB;

BufferedImage ret = (BufferedImage) img;

int w, h;

if (higherQuality) {

// Use multi-step technique: start with original size, then

// scale down in multiple passes with drawImage()

// until the target size is reached

w = img.getWidth();

h = img.getHeight();

} else {

// Use one-step technique: scale directly from original

// size to target size with a single drawImage() call

w = targetWidth;

h = targetHeight;

}

do {

if (higherQuality && w < targetWidth) {

w *= 2;

if (w > targetWidth) {

w = targetWidth;

}

}

if (higherQuality && h < targetHeight) {

h *= 2;

if (h > targetHeight) {

h = targetHeight;

}

}

BufferedImage tmp = new BufferedImage(w, h, type);

Graphics2D g2 = tmp.createGraphics();

g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);

g2.drawImage(ret, 0, 0, w, h, null);

g2.dispose();

ret = tmp;

tmp = null;

} while (w != targetWidth || h != targetHeight);

return ret;

}

}

}

java iconiamge大小_java – 自动将ImageIcon缩放到标签大小相关推荐

  1. java 文件 缓冲区大小_Java web 中文件下载遇到的缓冲大小问题

    刚才自己做一个小例子,就是在android端点击一个button,然后从服务器端下载文件到手机SD卡.结果却遇到了问题,刚开始挺兴奋的,因为自己做的可以下载下来文件了,但是自习看才发现有问题,那就是下 ...

  2. java swing 如何设置按钮大小_Java Swing - Button不改变宽度的大小

    我有一个使用FlowLayout的JPanel和一个垂直排列组件的Box. 我想要的是将其他组件的宽度大小设置为"删除列"按钮. 我试着线Java Swing - Button不改 ...

  3. java word 纸张大小_Java 设置 Word 页边距, 页面大小, 页面方向, 页面边框

    Java 设置 Word 页边距, 页面大小, 页面方向, 页面边框 本文将通过 Java 示例介绍如何设置 Word 页边距 (包括上, 下, 左, 右), 页面大小 (可设置 Letter/A3/ ...

  4. java imageicon大小_Java 自动缩放ImageIcon到标签大小

    小编典典 这是一个棘手的问题.你强调了一个事实,即你正在使用a JLabel来显示图像,这是标准的处理方式,但是却JLabel是一个复杂的小野兽,具有文本,图标以及文本的对齐和定位. 如果你不需要所有 ...

  5. 调整java字体大小_Java自动调整到Windows 7的字体大小调整

    这有两个部分: >获取您的组件,字体等 规模化 >获取您的布局 规模 对于Swing来说,第一部分很容易 – 一切都从一个电话开始. UIManager.setLookAndFeel(UI ...

  6. java裁剪图片_java实现图片的缩放和裁剪

    最近要做一个web项目,里面涉及到对图片的缩放和裁剪.原理是这样的,首先先对图片进行缩放,然后,将缩放之后的图片进行裁剪,里面涉及到许多java图片api的应用,代码如下. //参数分别对应了员图片的 ...

  7. java应用窗口大小_java 如何让程序窗口随屏幕大小改变 | 学步园

    这个问题一直困扰我很长时间了,虽然工作了一段时间,但感觉连这个问题都解决不好的话,实在对不起自己.今天我终于抽出时间,好好网上找了下资料,然后写了个简单的记事本程序,感觉是我想要的结果.所以在这里把程 ...

  8. java获取密钥长度_java.security.InvalidKeyException:解密期间密钥大小错误

    在解密期间,我得到的是"错误的密钥大小"或"给定的最终块未正确填充" ,这取决于我正在运行的操作系统. 在Win7上,使用IBMJCE或SUNJCE(两者都是J ...

  9. java 拆箱_Java自动装箱拆箱

    一.装箱.拆箱定义 如果一个int型量被传递到需要一个Integer对象的地方,那么,编译器将在幕后插入一个对Integer构造方法的调用,这就叫做自动装箱.而如果一个Integer对象被放到需要in ...

最新文章

  1. 4.10日一直报错application未注入的问题解决
  2. Java基础案例教程
  3. CodeForces - 1484E Skyline Photo(dp+单调栈)
  4. 网络低俗词_从“低俗小说”中汲取7堂课,以创建有影响力的作品集
  5. LeetCode 2105. 给植物浇水 II(双指针)
  6. c语言define定义全局变量,webpack中使用DefinePlugin定义全局变量
  7. git linux 部署网站,centos 搭建git自动部署web应用
  8. 【Cli下在vue.config.js配置configureWebpack/resolve/alias之无效 - 】
  9. Resharper进阶一:简要介绍
  10. 算法:冒泡排序、一阶滤波
  11. 谁偷偷删了你的微信?别慌!一篇Python学习教程帮你都揪出来
  12. Dll注入技术之驱动注入
  13. Description: 80010105 / 服务器出现意外情况。【亲测可用】
  14. 开源一款资源分享与下载工具 —— 电驴(eMule)
  15. CENTOS7开机自启动脚本
  16. 读取cpu温度的api_读取CPU核心温度
  17. ajax请求接口连不上会报错吗_本地ajax请求服务器
  18. vue将文件图片批量打包下载zip
  19. 骑着单车追随你——西西里的美丽传说
  20. 【Flink实战系列】Flink 本地 Web UI 的配置及使用

热门文章

  1. 临汾空气质量排名垫底是因不努力?生态环境部回应
  2. CES 2016逛展攻略:三大展区万家展台 你不能错过!
  3. 【20保研】关于举办哈尔滨工业大学(威海)“英才计划”暑期夏令营暨优秀硕士生源选拔活动的通知...
  4. 签名密钥和加密密钥区别?
  5. 企业数字化基础设施技术简介
  6. 物理像素、CSS像素、dip、dpr、ppi、dpi
  7. 如何在Eero路由器上设置静态IP地址
  8. 【滑窗】B024_LC_和相同的二元子数组(暴力前缀和 / map 优化)
  9. linux 内存与磁盘管理
  10. 计算机默认存储格式,表格默认保存为et格式