图片特效算法 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页全文完 |
|
来自: duckplayer > 《图片特效》