栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

调整BufferedImage的大小并将其存储到文件中会导致JPG图像的黑色背景

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

调整BufferedImage的大小并将其存储到文件中会导致JPG图像的黑色背景

当我运行您的代码时,我没有得到黑色背景,但是图像的颜色看起来很奇怪(通道似乎被弄乱了)。

当我 改变图像类型

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;    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/516050.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号