Graphics2D截取图片前须验证图像非null且可读,校验裁剪坐标不越界,复用源图色彩模型,保存时注意格式限制与alpha通道处理。
用
截取图片区域前,先确认图像是否可读取且非 null
直接调用
或新建
后立刻绘图,却忽略源图加载失败,是裁剪结果为空白或抛
的最常见原因。Java 图像 I/O 默认不抛异常,
对损坏/不支持格式的文件会静默返回
。
务必检查返回值:
注意路径编码:Windows 下中文路径可能触发
,优先用
或转为
某些 WebP、HEIC 格式需额外加库(如
),否则
也返回
裁剪坐标和尺寸必须严格落在原图边界内,否则
抛
看似最简,但它不做越界校验——只要
或
,就直接崩溃。而用
绘制时越界只是“画不出”,更难定位问题。
手动截断:用
和
修正宽高
负坐标要归零:
如果 UI 允许拖拽选区,建议在绘制预览时就禁用超出边界的鼠标操作,而不是等裁剪时再处理
用
绘制裁剪区域时,别漏掉
和色彩空间继承
从源图创建新
后获取
,若不设置渲染提示或忽略源图色彩模型,生成图可能出现色偏、透明通道丢失、文字锯齿等问题,尤其在 PNG 带 alpha 时。
创建目标图时复用源图类型:
,避免硬写
绘制前设置抗锯齿和渲染质量:
用完
必须
,否则可能引发资源泄漏(尤其在循环批量处理时)
裁剪小图再放大显示?别用
,改用
减少模糊
保存裁剪结果时,
不支持 WebP,且 JPEG 默认丢弃 alpha 通道
即使裁剪逻辑完全正确,保存环节也可能让结果“看起来失败”:透明背景变黑、细节发虚、文件打不开。这是因为
内置只支持 JPEG、PNG、GIF,且 JPEG 编码器默认强制转为 RGB。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
PNG 保留 alpha:
JPEG 强制去透明:
WebP 需引入第三方 writer,例如
,然后注册插件并用
格式名
注意输出路径父目录存在性:
,否则静默失败
实际裁剪逻辑本身并不复杂,真正卡住人的永远是图像加载状态、坐标越界、色彩模型错配和保存格式限制这四点。尤其是 alpha 通道和 WebP 这类“看似应该支持”的场景,Java 标准库的沉默行为很容易让人查半天配置。
Graphics2DgetGraphics()BufferedImageNullPointerExceptionImageIO.read()nullBufferedImage src = ImageIO.read(new File("input.jpg")); if (src == null) throw new IllegalArgumentException("无法加载图片");FileNotFoundExceptiongetClass().getResource()File.toURI()io.github.cdimascio:java-webpImageIO.read()nullBufferedImage.getSubimage()RasterFormatExceptiongetSubimage(x, y, w, h)x + w > src.getWidth()y + h > src.getHeight()Graphics2DMath.min(w, src.getWidth() - x)Math.min(h, src.getHeight() - y)x = Math.max(0, x); y = Math.max(0, y)Graphics2Ddispose()BufferedImageGraphics2Dnew BufferedImage(src.getWidth(), src.getHeight(), src.getType())TYPE_INT_ARGBg2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);Graphics2Dg2d.dispose()drawImage(..., SCALE_DEFAULT)VALUE_INTERPOLATION_BICUBICImageIO.write()ImageIOImageIO.write(cropped, "png", new File("out.png"))BufferedImage rgb = new BufferedImage(cropped.getWidth(), cropped.getHeight(), BufferedImage.TYPE_INT_RGB); rgb.createGraphics().drawImage(cropped, 0, 0, Color.WHITE, null);com.twelvemonkeys.imageio:imageio-webp"webp"out.getParentFile().mkdirs()