<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->

接着来分析带抖动转换的565算法:

void to_565_raw_dither(int width)

{

unsigned char in[3];

unsigned short out;

int i = 0;

int e;

创建两个点的误差保存数组。

int* error = malloc((width+2) * 3 * sizeof(int));

int* next_error = malloc((width+2) * 3 * sizeof(int));

清空误差数组。

memset(error, 0, (width+2) * 3 * sizeof(int));

memset(next_error, 0, (width+2) * 3 * sizeof(int));

计算数组是使用三个点误差来计算,所以从-3开始。

error += 3; // array goes from [-3..((width+1)*3+2)]

next_error += 3;

读取原文件里的数据。

while(read(0, in, 3) == 3) {

计算当前点的值,当然这里已经使用以前点值进行扩散。

int r = in[0] + error[i*3+0];

int rb = (r < 0) ? 0 : ((r > 255) ? 255 : r);

int g = in[1] + error[i*3+1];

int gb = (g < 0) ? 0 : ((g > 255) ? 255 : g);

int b = in[2] + error[i*3+2];

int bb = (b < 0) ? 0 : ((b > 255) ? 255 : b);

out = to565(rb, gb, bb);

write(1, &out, 2);

计算误差值,以便下一个点值进行颜色调整。

#define apply_error(ch) { \

next_error[(i-1)*3+ch] += e * 3 / 16; \

next_error[(i)*3+ch] += e * 5 / 16; \

next_error[(i+1)*3+ch] += e * 1 / 16; \

error[(i+1)*3+ch] += e - ((e*1/16) + (e*3/16) + (e*5/16)); \

}

当前计算出来的颜色,与565里恢复出来的误差值。

e = r - from565_r(out);

apply_error(0);

e = g - from565_g(out);

apply_error(1);

e = b - from565_b(out);

apply_error(2);

#undef apply_error

++i;

到最后,清空误差值。

if (i == width) {

// error <- next_error; next_error <- 0

int* temp = error; error = next_error; next_error = temp;

memset(next_error, 0, (width+1) * 3 * sizeof(int));

i = 0;

}

}

删除分配的空间。

free(error-3);

free(next_error-3);

return;

}


到这里就把这个简短的代码分析完成了,别看这么一段程序,它其实还是包括很多技术在里面的,比如shell的了解、565颜色编码、游程编码、色差抖动算法。因此,要写出上面这个程序,要懂得比较的广博的知识,谁说知识无用呢?

更多相关文章

  1. android -- TextView 部分字符带颜色 与 popupwindow 的使用
  2. Android(安卓)8位颜色值和6位颜色值的区别
  3. Android学习札记6:ProgressBar圆形进度条的颜色设置
  4. SQLite在Android中使用注意事项
  5. 对hint 设置大小及颜色,可用此方法对字符串设置不同颜色或大小
  6. Android(安卓)TextView 中设置text的格式
  7. android 设置状态栏颜色
  8. android中Shade应用
  9. android 将文字转为为图片

随机推荐

  1. Android从按下开机键到启动发生了什么
  2. 使用Frida渗透Android(安卓)app
  3. Android(安卓)设计思想
  4. eclipse paho包对于ActiveMQ持久化订阅者
  5. 轻松理解 Android(安卓)Binder,只需要读这
  6. gRPC在Android中的应用、配置、生成文件
  7. Android新手如何快速开发一款app
  8. DNS负载均衡,导致Android和iOS访问接口,导
  9. 关于XRecyclerView重复下拉在MVP中崩溃
  10. android中对sd卡文件的管理