You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在仅使用Java Graphics与Java Color的情况下将图像缩小一半(替代原Graphics2D实现)

解决方案:仅用Graphics和Color实现图像缩小至一半

没问题,我可以帮你实现一个只依赖Graphics和Color类的图像缩小方案。核心思路是手动逐像素采样——因为不能用Graphics2D的现成缩放方法,我们会直接操作原图像的像素,计算缩小后每个像素的颜色值,再通过Graphics绘制到新图像上。

实现代码

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class ImageShrinker {
    public static void shrink(String origPath, String outputPath) throws Exception {
        // 读取原始图像
        BufferedImage originalImage = ImageIO.read(new File(origPath));
        int origWidth = originalImage.getWidth();
        int origHeight = originalImage.getHeight();
        
        // 计算缩小后的尺寸(原尺寸的一半)
        int newWidth = origWidth / 2;
        int newHeight = origHeight / 2;
        
        // 创建目标图像
        BufferedImage shrunkImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
        Graphics g = shrunkImage.getGraphics();
        
        // 遍历目标图像的每个像素
        for (int y = 0; y < newHeight; y++) {
            for (int x = 0; x < newWidth; x++) {
                // 计算原图像中对应的2x2像素区域的左上角坐标
                int origX = x * 2;
                int origY = y * 2;
                
                // 取2x2区域的四个像素颜色(处理边界情况,避免越界)
                Color c1 = new Color(originalImage.getRGB(Math.min(origX, origWidth - 1), Math.min(origY, origHeight - 1)));
                Color c2 = new Color(originalImage.getRGB(Math.min(origX + 1, origWidth - 1), Math.min(origY, origHeight - 1)));
                Color c3 = new Color(originalImage.getRGB(Math.min(origX, origWidth - 1), Math.min(origY + 1, origHeight - 1)));
                Color c4 = new Color(originalImage.getRGB(Math.min(origX + 1, origWidth - 1), Math.min(origY + 1, origHeight - 1)));
                
                // 计算四个颜色的平均值(RGB通道分别平均)
                int avgRed = (c1.getRed() + c2.getRed() + c3.getRed() + c4.getRed()) / 4;
                int avgGreen = (c1.getGreen() + c2.getGreen() + c3.getGreen() + c4.getGreen()) / 4;
                int avgBlue = (c1.getBlue() + c2.getBlue() + c3.getBlue() + c4.getBlue()) / 4;
                int avgAlpha = (c1.getAlpha() + c2.getAlpha() + c3.getAlpha() + c4.getAlpha()) / 4;
                
                // 创建平均后的颜色,设置到目标图像
                Color avgColor = new Color(avgRed, avgGreen, avgBlue, avgAlpha);
                g.setColor(avgColor);
                g.fillRect(x, y, 1, 1);
            }
        }
        
        // 释放资源并保存图像
        g.dispose();
        ImageIO.write(shrunkImage, "png", new File(outputPath));
    }

    public static void main(String[] args) throws Exception {
        shrink("original.png", "shrunk.png");
    }
}

关键细节说明

  • 像素采样策略:这里用了2x2区域的颜色平均值,相比直接取单个像素(比如左上角),能得到更平滑的缩小效果,避免锯齿感。
  • 边界处理:当原图像的宽/高是奇数时,最后一行/列的区域会越界,用Math.min()确保我们始终取到有效的像素坐标。
  • 仅依赖指定类:整个实现只使用了Graphics(用于绘制像素)和Color(用于处理颜色值),没有用到Graphics2D或其他第三方库。
  • 透明度支持:保留了Alpha通道的平均计算,确保带透明背景的PNG图像缩小后依然正常显示。

如果你想要更简单的实现(比如直接取每个2x2区域的左上角像素),可以简化颜色计算部分,直接取originalImage.getRGB(origX, origY)作为目标像素的颜色,这样代码会更短,但效果可能稍差。

内容的提问来源于stack exchange,提问作者MrDriller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:47:47