作者 主题: [ 作业讨论 ] DAY5 - Saturation/Brightness  (阅读 6841 次)

Linyew

  • Newbie
  • *
  • 帖子: 7
[ 作业讨论 ] DAY5 - Saturation/Brightness
« 于: 十一月 18, 2011, 11:23:55 下午 »
请老师点评 :)

程序代码
PImage Img;
void setup(){
  Img = loadImage("source.jpg");
  size(Img.width,Img.height);
  colorMode(HSB, 255);
}
void draw(){
  //background(255,0,0);
  image(Img,0,0);
  loadPixels();
  for (int i=0;i<height;i++) {
    for (int j=0;j<width;j++) {
      int index = j+i*width;
      float hue_ = hue(pixels[index]);
      float saturation_ = saturation(pixels[index])-(mouseX*255/width);
      float brightness_ = brightness(pixels[index])-(mouseY*255/height);
      pixels[index] = color(hue_,saturation_,brightness_);
    }
  }
  updatePixels(); 
}

RavenKwok

  • Sr. Member
  • ****
  • 帖子: 277
  • Artist/ Animator/ Coder/ Cynical Asshole
Re: [ 作业讨论 ] DAY5 - Saturation/Brightness
« 回复 #1 于: 十一月 20, 2011, 09:26:27 上午 »
@Linyew

哈哈,很好阿。
小建议一个,为了增加代码可读性,可以再多定义两个变量,satMapping,briMapping。然后在setup() 中完成初始化。

satMapping = 255/float(width);
briMapping = 255/float(height);

在draw() 中就可以直接调用他们。

float saturation_ = saturation(pixels[index])-mouseX*satMapping;
float brightness_ = brightness(pixels[index])-mouseY*briMapping;

这样可读性会更好些。 8)

山泉

  • Newbie
  • *
  • 帖子: 4
Re: [ 作业讨论 ] DAY5 - Saturation/Brightness
« 回复 #2 于: 十一月 20, 2011, 11:16:51 上午 »
赶在上课前提交下下。。。打包到附件了同时~
只是通过鼠标和原点的直线距离与图片对角线距离的比率控制对比度~。采用深拷贝的方式存储了图像的初始像素,可以免除今后多次重复绘制图像 ;D

程序代码
color[] originPixels;

void setup() {
  PImage img = loadImage("source.jpg");
  colorMode(HSB, 360, 360, 360);
  size(img.width, img.height);
  image(img, 0, 0);
  loadPixels();
  originPixels = pixelsDeepCopy(pixels);
}

void draw() {
  float distofMouse = dist(mouseX, mouseY, 0, 0);
  float slopeLine = dist(width, height, 0, 0);
  float changeValue = (slopeLine-distofMouse)/slopeLine;
  for (int i=0; i<height; i++) {
    for (int j = 0; j < width; j++) {
      int pixelIndex = i*width+j;
      color pixel = originPixels[pixelIndex];
      float hvalue = hue(pixel);
      float svalue = saturation(pixel);
      float bvalue = brightness(pixel);
      svalue = svalue*changeValue;
      pixels[pixelIndex] = color(hvalue, svalue, bvalue);
    }
  }
  updatePixels();
}

color[] pixelsDeepCopy(color[] originalPixels) {
  color[] copiedColors = new color[originalPixels.length];
  for (int i = 0; i < originalPixels.length; i++) {
    color oc = originalPixels[i];
    float hvalue = hue(oc);
    float svalue = saturation(oc);
    float bvalue = brightness(oc);
    color c = color(hvalue,svalue,bvalue);
    copiedColors[i] = c;
  }
  return copiedColors;
}
« 最后编辑时间: 十一月 20, 2011, 11:20:42 上午 作者 山泉 »

Tags: