当我运行您的代码时,我没有得到黑色背景,但是图像的颜色看起来很奇怪(通道似乎被弄乱了)。
当我 改变图像类型 中
toBufferedImage(..),以
BufferedImage.TYPE_INT_RGB( 没有阿尔法
,因为JPEG不支持透明度),一切工作正常。
仍然很奇怪
ImageIO在编写JPEG图像时没有考虑到这一点…
顺便说一下,异步图像缩放(
getScaledInstance(..)不是那样)不是问题,我确保在继续操作之前已完成图像大小调整,这对结果没有影响。
要完全加载图像,请使用
MediaTracker:
public static void loadCompletely (Image img) { MediaTracker tracker = new MediaTracker(new JPanel()); tracker.addImage(img, 0); try { tracker.waitForID(0); } catch (InterruptedException ex) { throw new RuntimeException(ex); }}编辑
这是我用来调整图像大小,保留比例的代码(不同的调整大小方法取决于您是放大还是缩小,以及更快的面积平均替代方法):
public static BufferedImage resizeImage (BufferedImage image, int areaWidth, int areaHeight) { float scaleX = (float) areaWidth / image.getWidth(); float scaleY = (float) areaHeight / image.getHeight(); float scale = Math.min(scaleX, scaleY); int w = Math.round(image.getWidth() * scale); int h = Math.round(image.getHeight() * scale); int type = image.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB; boolean scaleDown = scale < 1; if (scaleDown) { // multi-pass bilinear div 2 int currentW = image.getWidth(); int currentH = image.getHeight(); BufferedImage resized = image; while (currentW > w || currentH > h) { currentW = Math.max(w, currentW / 2); currentH = Math.max(h, currentH / 2); BufferedImage temp = new BufferedImage(currentW, currentH, type); Graphics2D g2 = temp.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2.drawImage(resized, 0, 0, currentW, currentH, null); g2.dispose(); resized = temp; } return resized; } else { Object hint = scale > 2 ? RenderingHints.VALUE_INTERPOLATION_BICUBIC : RenderingHints.VALUE_INTERPOLATION_BILINEAR; BufferedImage resized = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = resized.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint); g2.drawImage(image, 0, 0, w, h, null); g2.dispose(); return resized; }}


