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

基于Java BufferedImage的图像滤镜:如何逐步将像素调整为全灰度图像

Java BufferedImage 渐进灰度过渡实现方案

这个效果本质是彩色像素到灰度像素的权重混合过渡,你可以通过控制灰度占比的方式生成中间状态,步骤如下:

基础逻辑说明

首先采用符合人眼感知的灰度计算公式,比直接取RGB平均值的效果更自然:
gray = 0.299 * R + 0.587 * G + 0.114 * B

引入过渡系数t,取值范围0~1:

  • t=0:完全保留原始彩色,对应状态(a)
  • 0<t<1:彩色和灰度按比例混合,对应状态(b)(c)
  • t=1:完全转为灰度,对应状态(d)

每个像素的通道混合公式为:

新R = 原始R * (1 - t) + gray * t
新G = 原始G * (1 - t) + gray * t
新B = 原始B * (1 - t) + gray * t

Alpha通道如果原图带透明效果可以直接保留,无需修改。

具体实现步骤

  • 先预存原始图像的像素数组,避免每帧重复读取原始数据:
    int width = originalImg.getWidth();
    int height = originalImg.getHeight();
    int[] originalPixels = originalImg.getRGB(0, 0, width, height, null, 0, width);
    
  • 每帧根据当前的t值生成过渡图像,可复用同一个BufferedImage对象降低内存开销:
    // 每帧渲染逻辑
    BufferedImage frameImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    int[] framePixels = new int[width * height];
    for (int i = 0; i < originalPixels.length; i++) {
        int argb = originalPixels[i];
        int a = (argb >> 24) & 0xff;
        int r = (argb >> 16) & 0xff;
        int g = (argb >> 8) & 0xff;
        int b = argb & 0xff;
        // 计算灰度值
        int gray = (int)(0.299 * r + 0.587 * g + 0.114 * b);
        // 混合通道
        int newR = (int)(r * (1 - t) + gray * t);
        int newG = (int)(g * (1 - t) + gray * t);
        int newB = (int)(b * (1 - t) + gray * t);
        // 组装新像素
        framePixels[i] = (a << 24) | (newR << 16) | (newG << 8) | newB;
    }
    frameImg.setRGB(0, 0, width, height, framePixels, 0, width);
    
  • 控制t的递增速度即可调整过渡时长,比如每帧t += 0.02,50帧即可完成完整过渡。

可选效果优化

如果需要实现示例图中从左到右逐步变灰的扫动效果,只需在混合逻辑中加入坐标判断即可:

// 遍历像素时增加坐标计算
int x = i % width;
int threshold = (int)(t * width);
if (x < threshold) {
    // 左侧已经扫过的区域用灰度值
    newR = newG = newB = gray;
} else if (x < threshold + 50) {
    // 边缘过渡带用混合逻辑
    float localT = (x - threshold) / 50f;
    newR = (int)(r * localT + gray * (1 - localT));
    newG = (int)(g * localT + gray * (1 - localT));
    newB = (int)(b * localT + gray * (1 - localT));
}
// 右侧未扫过的区域保留原始色

大尺寸图像渲染时可以用Raster批量处理像素,或者分块开多线程计算,能大幅提升性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 17:36:03