面向对象设计的老师要我们每个人用写个不少于一万行代码的项目。开始还是想写游戏来着,毕竟写游戏算是轻车熟路,但是老师又规定只能用java写,算了,用java写游戏似乎不太明智。写什么玩意好呢。颠来倒去想了好久。算了,既然现阶段是做图像处理方面的,那就做个类似美图秀秀之类的玩意吧。(虽然用java做图像也必将非主流,不过也不管那么多了)。
其实写这篇博客的时候,我的代码已经凑够一万行了。项目算不上什么创新,最多只是对一些小算法的模仿罢了。我也不知道为什么要先写局部彩色功能,可能是因为毕竟简单吧。
局部彩色呢,原理其实很简单,先由原图生成一张灰度图。再将被擦除的部分用原图替换过来。
1.生成灰度图。这个很简单,不多废话。
2.用鼠标涂抹。每次涂抹,就将以涂抹点为圆心,画笔大小为擦除半径的圆内的像素替换为彩色图上对应点的像素值。
/**
* 擦除应用在源图片上的效果(圆形区域)
*
* @param currImage
* 当前图片
* @param sourceImage
* 原图片
* @param centerX
* 擦除的中心点X坐标
* @param centerY
* 擦除的中心点Y坐标
* @param radius
* 擦除的半径
* */
public static BufferedImage getImage(BufferedImage currImage, BufferedImage sourceImage, int centerX, int centerY, int radius)
{
int startX = centerX - radius;
int startY = centerY - radius;
int endX = centerX + radius;
int endY = centerY + radius;
startX = startX < 0 ? 0 : startX;
startY = startY < 0 ? 0 : startY;
endX = endX > currImage.getWidth() ? currImage.getWidth() : endX;
endY = endY > currImage.getHeight() ? currImage.getHeight() : endY;
for (int y = startY; y < endY; y++)
{
for (int x = startX; x < endX; x++)
{
if (Geometry.getDistance(x, y, centerX, centerY) < radius)
{
currImage.setRGB(x, y, sourceImage.getRGB(x, y));
}
}
}
return currImage;
}
效果:
原图
灰度图
局部彩色