分享

android图片特效算法

 duckplayer 2016-03-23
  图片特效算法 1、 把资源图片转为灰度图

  原理: 彩色图像处理成黑白效果通常有3种算法!

  (1).最大值法!使每个像素点的 R, G, B 值等于原像素点的 RGB(颜色值)中最大的一

  个,

  (2).平均值法!使用每个像素点的 R,G,B值等于原像素点的RGB值的平均值,

  (3).加权平均值法!对每个像素点的 R,G, B值进行加权

  以下是平均法!

  // 获取当前点

  pos = y * width + x;

  // 获取图片当前点的像素值

  pixColor = dst[pos];

  // 获取RGB三原色

  R = Color.red(pixColor);

  G = Color.green(pixColor);

  B = Color.blue(pixColor);

  // 去平均

  pixel = (R + G + B) / 3;

  R = G = B = pixel;

  2、 底片效果

  原理: GetPixel方法获得每一点像素的值, 然后再使用SetPixel方法将取反后的颜色值设

  置到对应的点

  // RGB三色取反

  pixel = R;

  pixel = 255 - pixel;

  R = pixel; // 计算后重置R值,以下类同

  pixel = G;

  pixel = 255 - pixel;

  G = pixel;

  pixel = B;

  pixel = 255 - pixel;

  B = pixel;

  3、 浮雕效果

  原理: 对图像像素点的像素值分别与相邻像素点的像素值相减后加上128, 然后将其作

  为新的像素点的值.

  pos = y * width + x;

  pos1 = (y + 1) * width + (x + 1);

  pixColor = dst[pos]; // 获取图片当前点的像素值

  pixColor1 = dst[pos1]; // 获取图片当前点的像素值

  1/6页

  R = Color.red(pixColor); // 获取RGB三原色

  G = Color.green(pixColor);

  B = Color.blue(pixColor);

  R1 = Color.red(pixColor1); // 获取RGB三原色

  G1 = Color.green(pixColor1);

  B1 = Color.blue(pixColor1);

  R = Math.abs(R - R1 + 128);

  G = Math.abs(G - G1 + 128);

  B = Math.abs(B - B1 + 128);

  if (R

  R = 0;

  if (R > 255)

  R = 255;

  if (G

  G = 0;

  if (G > 255)

  G = 255;

  if (B

  B = 0;

  if (B > 255)

  B = 255;

  4、 冰冻效果

  pixel = R - G - B;

  pixel = pixel * 3 / 2;

  if (pixel

  pixel = -pixel;

  if (pixel > 255)

  pixel = 255;

  R = pixel; // 计算后重置R值,以下类同

  pixel = G - B - R;

  pixel = pixel * 3 / 2;

  if (pixel

  pixel = -pixel;

  if (pixel > 255)

  pixel = 255;

  G = pixel;

  pixel = B - R - G;

  pixel = pixel * 3 / 2;

  2/6页

  if (pixel

  pixel = -pixel;

  if (pixel > 255)

  pixel = 255;

  B = pixel;

  5、 雾化效果

  原理: 在图像中引入一定的随机值, 打乱图像中的像素值

  Random MyRandom = new Random();

  // 随机数,在像素块数值不变时,随机数数值越大越模糊,像素块越密集

  int k = MyRandom.nextInt(123456);

  // 像素块大小;在随机数不变的情况下,所除的数越大越模糊,越密集

  int dx = x + k % 8;

  int dy = y + k % 8;

  if (dx >= width)

  dx = width - 1;

  if (dy >= height)

  dy = height - 1;

  pos = dy * width + dx;

  pos1 = y * width + x;

  dst[pos1] = dst[pos]; // 获取图片当前点的像素值

  6、 积木效果

  原理: 对图像中的各个像素点着重(即加大分像素的颜色值)着色.

  // 去平均

  pixel = (R + G + B) / 3;

  if (pixel >= 128) {

  pixel = 255;

  } else {

  pixel = 0;

  }

  R = G = B = pixel;

  7、 熔铸效果

  pixel = R * 128 / (G + B + 1);

  if (pixel

  pixel = 0;

  if (pixel > 255)

  pixel = 255;

  R = pixel;

  pixel = G * 128 / (B + R + 1);

  if (pixel

  pixel = 0;

  3/6页

  if (pixel > 255)

  pixel = 255;

  G = pixel;

  pixel = B * 128 / (R + G + 1);

  if (pixel

  pixel = 0;

  if (pixel > 255)

  pixel = 255;

  B = pixel;

  8、 连环画效果

  // R = |g – b + g + r| * r / 256;

  pixel = Math.abs(G - B + G + R) * R / 256;

  if (pixel > 255)

  pixel = 255;

  R = pixel;

  // G = |b – g + b + r| * r / 256;

  pixel = Math.abs(B - G + B + R) * R / 256;

  if (pixel > 255)

  pixel = 255;

  G = pixel;

  // B = |b – g + b + r| * g / 256;

  pixel = Math.abs(B - G + B + R) * G / 256;

  if (pixel > 255)

  pixel = 255;

  B = pixel;

  9、 边缘高亮(霓虹处理)

  首先计算原图象像素f(i,j)的红,绿,蓝分量与相同行f?i+1,j?及同列f(i,j+1)相邻象素的梯度,即差的平方之和的平方根,然后将梯度值作为处理后的象素g(i,j)的红,绿,蓝分量值。

  // 获取当前点

  pos = y * width + x;

  pos1 = y * width + x + width;

  pos2 = y * width + x + 1;

  // 获取图片当前点的像素值

  pixColor = dst[pos];

  pixColor1 = dst[pos1];

  pixColor2 = dst[pos2];

  // R 取值

  pixel = (int) (Math.pow((Color.red(pixColor) - Color.red(pixColor1)), 2) + Math

  4/6页

  .pow((Color.red(pixColor) - Color.red(pixColor2)), 2));

  pixel = (int) (Math.sqrt(pixel) * 2);

  if (pixel

  pixel = 0;

  if (pixel > 255)

  pixel = 255;

  R = pixel;

  // G 取值

  pixel = (int) (Math.pow((Color.green(pixColor) - Color.green(pixColor1)), 2) + Math

  .pow((Color.green(pixColor) - Color.green(pixColor2)),2));

  pixel = (int) (Math.sqrt(pixel) * 2);

  if (pixel

  pixel = 0;

  if (pixel > 255)

  pixel = 255;

  G = pixel;

  // B 取值

  pixel = (int) (Math.pow((Color.blue(pixColor) - Color.blue(pixColor1)), 2) + Math

  .pow((Color.blue(pixColor) - Color.blue(pixColor2)), 2));

  pixel = (int) (Math.sqrt(pixel) * 2);

  if (pixel

  pixel = 0;

  if (pixel > 255)

  pixel = 255;

  B = pixel;

  10、 锐化效果

  计算原图像像素f(i,j)的像素值与该像素与相邻像素f(i-1,j-1)像素值之差的绝对值得百分比之和,作为处理后图像像素g(i,j)的像素值。

  // 获取当前点

  pos1 = y * width + x;

  pos2 = (y + 1) * width + (x + 1);

  pixColor1 = dst[pos1];

  pixColor2 = dst[pos2];

  // 获取点1 的三色值

  r1 = Color.red(pixColor1);

  g1 = Color.green(pixColor1);

  b1 = Color.blue(pixColor1);

  // 获取点 2 的三色值

  r2 = Color.red(pixColor2);

  g2 = Color.green(pixColor2);

  b2 = Color.blue(pixColor2);

  // 计算新的三色值

  r = r1 + (temp / 100) * Math.abs(r1 - r2);

  5/6页  图片特效算法 1、 把资源图片转为灰度图

  原理: 彩色图像处理成黑白效果通常有3种算法!

  (1).最大值法!使每个像素点的 R, G, B 值等于原像素点的 RGB(颜色值)中最大的一

  个,

  (2).平均值法!使用每个像素点的 R,G,B值等于原像素点的RGB值的平均值,

  (3).加权平均值法!对每个像素点的 R,G, B值进行加权

  以下是平均法!

  // 获取当前点

  pos = y * width + x;

  // 获取图片当前点的像素值

  pixColor = dst[pos];

  // 获取RGB三原色

  R = Color.red(pixColor);

  G = Color.green(pixColor);

  B = Color.blue(pixColor);

  // 去平均

  pixel = (R + G + B) / 3;

  R = G = B = pixel;

  2、 底片效果

  原理: GetPixel方法获得每一点像素的值, 然后再使用SetPixel方法将取反后的颜色值设

  置到对应的点

  // RGB三色取反

  pixel = R;

  pixel = 255 - pixel;

  R = pixel; // 计算后重置R值,以下类同

  pixel = G;

  pixel = 255 - pixel;

  G = pixel;

  pixel = B;

  pixel = 255 - pixel;

  B = pixel;

  3、 浮雕效果

  原理: 对图像像素点的像素值分别与相邻像素点的像素值相减后加上128, 然后将其作

  为新的像素点的值.

  pos = y * width + x;

  pos1 = (y + 1) * width + (x + 1);

  pixColor = dst[pos]; // 获取图片当前点的像素值

  pixColor1 = dst[pos1]; // 获取图片当前点的像素值

  1/6页

  R = Color.red(pixColor); // 获取RGB三原色

  G = Color.green(pixColor);

  B = Color.blue(pixColor);

  R1 = Color.red(pixColor1); // 获取RGB三原色

  G1 = Color.green(pixColor1);

  B1 = Color.blue(pixColor1);

  R = Math.abs(R - R1 + 128);

  G = Math.abs(G - G1 + 128);

  B = Math.abs(B - B1 + 128);

  if (R

  R = 0;

  if (R > 255)

  R = 255;

  if (G

  G = 0;

  if (G > 255)

  G = 255;

  if (B

  B = 0;

  if (B > 255)

  B = 255;

  4、 冰冻效果

  pixel = R - G - B;

  pixel = pixel * 3 / 2;

  if (pixel

  pixel = -pixel;

  if (pixel > 255)

  pixel = 255;

  R = pixel; // 计算后重置R值,以下类同

  pixel = G - B - R;

  pixel = pixel * 3 / 2;

  if (pixel

  pixel = -pixel;

  if (pixel > 255)

  pixel = 255;

  G = pixel;

  pixel = B - R - G;

  pixel = pixel * 3 / 2;

  2/6页

  if (pixel

  pixel = -pixel;

  if (pixel > 255)

  pixel = 255;

  B = pixel;

  5、 雾化效果

  原理: 在图像中引入一定的随机值, 打乱图像中的像素值

  Random MyRandom = new Random();

  // 随机数,在像素块数值不变时,随机数数值越大越模糊,像素块越密集

  int k = MyRandom.nextInt(123456);

  // 像素块大小;在随机数不变的情况下,所除的数越大越模糊,越密集

  int dx = x + k % 8;

  int dy = y + k % 8;

  if (dx >= width)

  dx = width - 1;

  if (dy >= height)

  dy = height - 1;

  pos = dy * width + dx;

  pos1 = y * width + x;

  dst[pos1] = dst[pos]; // 获取图片当前点的像素值

  6、 积木效果

  原理: 对图像中的各个像素点着重(即加大分像素的颜色值)着色.

  // 去平均

  pixel = (R + G + B) / 3;

  if (pixel >= 128) {

  pixel = 255;

  } else {

  pixel = 0;

  }

  R = G = B = pixel;

  7、 熔铸效果

  pixel = R * 128 / (G + B + 1);

  if (pixel

  pixel = 0;

  if (pixel > 255)

  pixel = 255;

  R = pixel;

  pixel = G * 128 / (B + R + 1);

  if (pixel

  pixel = 0;

  3/6页

  if (pixel > 255)

  pixel = 255;

  G = pixel;

  pixel = B * 128 / (R + G + 1);

  if (pixel

  pixel = 0;

  if (pixel > 255)

  pixel = 255;

  B = pixel;

  8、 连环画效果

  // R = |g – b + g + r| * r / 256;

  pixel = Math.abs(G - B + G + R) * R / 256;

  if (pixel > 255)

  pixel = 255;

  R = pixel;

  // G = |b – g + b + r| * r / 256;

  pixel = Math.abs(B - G + B + R) * R / 256;

  if (pixel > 255)

  pixel = 255;

  G = pixel;

  // B = |b – g + b + r| * g / 256;

  pixel = Math.abs(B - G + B + R) * G / 256;

  if (pixel > 255)

  pixel = 255;

  B = pixel;

  9、 边缘高亮(霓虹处理)

  首先计算原图象像素f(i,j)的红,绿,蓝分量与相同行f?i+1,j?及同列f(i,j+1)相邻象素的梯度,即差的平方之和的平方根,然后将梯度值作为处理后的象素g(i,j)的红,绿,蓝分量值。

  // 获取当前点

  pos = y * width + x;

  pos1 = y * width + x + width;

  pos2 = y * width + x + 1;

  // 获取图片当前点的像素值

  pixColor = dst[pos];

  pixColor1 = dst[pos1];

  pixColor2 = dst[pos2];

  // R 取值

  pixel = (int) (Math.pow((Color.red(pixColor) - Color.red(pixColor1)), 2) + Math

  4/6页

  .pow((Color.red(pixColor) - Color.red(pixColor2)), 2));

  pixel = (int) (Math.sqrt(pixel) * 2);

  if (pixel

  pixel = 0;

  if (pixel > 255)

  pixel = 255;

  R = pixel;

  // G 取值

  pixel = (int) (Math.pow((Color.green(pixColor) - Color.green(pixColor1)), 2) + Math

  .pow((Color.green(pixColor) - Color.green(pixColor2)),2));

  pixel = (int) (Math.sqrt(pixel) * 2);

  if (pixel

  pixel = 0;

  if (pixel > 255)

  pixel = 255;

  G = pixel;

  // B 取值

  pixel = (int) (Math.pow((Color.blue(pixColor) - Color.blue(pixColor1)), 2) + Math

  .pow((Color.blue(pixColor) - Color.blue(pixColor2)), 2));

  pixel = (int) (Math.sqrt(pixel) * 2);

  if (pixel

  pixel = 0;

  if (pixel > 255)

  pixel = 255;

  B = pixel;

  10、 锐化效果

  计算原图像像素f(i,j)的像素值与该像素与相邻像素f(i-1,j-1)像素值之差的绝对值得百分比之和,作为处理后图像像素g(i,j)的像素值。

  // 获取当前点

  pos1 = y * width + x;

  pos2 = (y + 1) * width + (x + 1);

  pixColor1 = dst[pos1];

  pixColor2 = dst[pos2];

  // 获取点1 的三色值

  r1 = Color.red(pixColor1);

  g1 = Color.green(pixColor1);

  b1 = Color.blue(pixColor1);

  // 获取点 2 的三色值

  r2 = Color.red(pixColor2);

  g2 = Color.green(pixColor2);

  b2 = Color.blue(pixColor2);

  // 计算新的三色值

  r = r1 + (temp / 100) * Math.abs(r1 - r2);

  g = g1 + (temp / 100) * Math.abs(g1 - g2);

b = b1 + (temp / 100) * Math.abs(b1 - b2);

6/6页全文完

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多