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

如何在Processing中仅调整图片饱和度而不改变色调?

仅调整Processing图片饱和度而不改变色调的方法

嘿,这个问题我之前也踩过坑!用tint()在HSB模式下确实会强制统一色调,完全不是我们想要的效果。不过有两种实用的方法能帮你精准调整饱和度,同时保留原图的所有色彩:

方法一:用内置filter()函数快速调整

Processing自带的filter()函数有专门的饱和度调整参数,操作简单还不会改色调,是最省心的方案:

PImage myPhoto;

void setup() {
  size(800, 600);
  myPhoto = loadImage("your-photo.jpg"); // 替换成你的图片路径
}

void draw() {
  background(255);
  // 调整饱和度:正数增强,负数降低,0为完全灰度
  myPhoto.filter(SATURATE, 1.8); // 这里1.8是增强80%,改成0.4就是降低60%
  image(myPhoto, 0, 0);
  noLoop(); // 避免重复绘制
}
  • 第二个参数是强度系数:大于1提升饱和度,0~1之间降低饱和度,0会直接把图片转成灰度
  • 这个方法是全局调整,一行代码就能搞定,适合快速需求

方法二:手动遍历像素实现精细控制

如果需要更灵活的调整(比如只修改图片某区域的饱和度),可以逐个像素提取HSB分量,单独修改饱和度后再合成颜色:

PImage myPhoto;
float satAdjustment = 0.6; // 这里0.6表示把饱和度降到原来的60%,大于1则增强

void setup() {
  size(800, 600);
  myPhoto = loadImage("your-photo.jpg");
  myPhoto.loadPixels(); // 加载像素数组
  
  for (int i = 0; i < myPhoto.pixels.length; i++) {
    color pixelColor = myPhoto.pixels[i];
    // 提取当前像素的HSB值
    float hueVal = hue(pixelColor);
    float satVal = saturation(pixelColor) * satAdjustment;
    float brightVal = brightness(pixelColor);
    
    // 确保饱和度值在0-255范围内(Processing默认HSB范围)
    satVal = constrain(satVal, 0, 255);
    
    // 重新合成颜色并替换原像素
    myPhoto.pixels[i] = color(hueVal, satVal, brightVal);
  }
  
  myPhoto.updatePixels(); // 更新像素数组
}

void draw() {
  background(255);
  image(myPhoto, 0, 0);
  noLoop();
}
  • 这种方法不需要切换全局colorMode,不会影响其他绘图操作
  • 你可以在循环里加条件判断,比如只调整亮度高于某个值的像素,实现更个性化的效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:43:42