日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java水泡_JAVA图像处理系列(八)——艺术效果:水泡

發(fā)布時間:2025/3/12 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java水泡_JAVA图像处理系列(八)——艺术效果:水泡 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

藝術效果水泡

通過對圖像進行變形或疊加其他圖片,能夠實現(xiàn)許多有趣的藝術效果,本文介紹類似水泡效果的實現(xiàn)方式,下面先看一下實現(xiàn)的效果。

第一張為原始圖像,第二張為疊加水泡效果的圖像。

cat.jpg

cat_belb.jpg

算法原理

圖像中的水泡效果,是由兩個算法疊加而成。第一個為計算水泡上反射光照的效果,第二個為圖像通過水泡折射后的形變計算。

(1)光照效果實現(xiàn)

通過設定光源的位置,及水泡上個點與光源的位置關系進行計算,下面是實現(xiàn)代碼:

public static void upLightPoint(BufferedImage image, int x, int y, double scale, double hall) {

Pixel pixel = new Pixel();

if (scale > 1)

scale = 1;

else if (scale < 0) {

if (hall == 0) {

scale = 0;

} else {

scale = scale / hall;

}

}

pixel.setRGB(image.getRGB(x, y));

if (scale >= 0) {

pixel.red = pixel.red + (int) ((255 - pixel.red) * scale);

pixel.green = pixel.green + (int) ((255 - pixel.green) * scale);

pixel.blue = pixel.blue + (int) ((255 - pixel.blue) * scale);

} else {

pixel.red = pixel.red + (int) (pixel.red * scale);

pixel.green = pixel.green + (int) (pixel.green * scale);

pixel.blue = pixel.blue + (int) (pixel.blue * scale);

}

image.setRGB(x, y, pixel.getRGB());

}

public static void drawBall(BufferedImage bimg, int x_center, int y_center, int radius, int x_lamp, int y_lamp) {

double z, z_lamp;

double distance;

for (int y = y_center - radius; y < y_center + radius; y++) {

for (int x = x_center - radius; x < x_center + radius; x++) {

distance = (x - x_center) * (x - x_center) + (y - y_center) * (y - y_center);

if (distance > radius * radius)

continue;

z = Math.sqrt(radius * radius - distance);

z_lamp = Math.sqrt(radius * radius - (x_lamp - x_center) * (x_lamp - x_center)

- (y_lamp - y_center) * (y_lamp - y_center));

distance = Math.sqrt(radius * radius * 2 - 2 * (x - x_center) * (x_lamp - x_center)

- 2 * (y - y_center) * (y_lamp - y_center) - 2 * z * z_lamp);

try {

upLightPoint(bimg, x, y, (1 - distance / radius / .5), 0);

} catch (Exception e) {

}

}

}

}

(2)折射效果實現(xiàn)

通過背景圖像圖水泡中心的位置關系,計算簡單的折射效果,代碼如下:

public static void belbImage(BufferedImage image, BufferedImage bimg, int x_center, int y_center, int radius) {

double scale = radius * Math.PI / 2;

double x1 = 0;

double y1 = 0;

for (int y = y_center - radius; y < y_center + radius; y++) {

for (int x = x_center - radius; x < x_center + radius; x++) {

double distance = Math.sqrt((x - x_center) * (x - x_center) + (y - y_center) * (y - y_center));

if (distance > radius)

continue;

double hu = Math.asin(distance / radius);

double v = hu * scale * 4.14 / 180.0;

x1 = x_center + (x - x_center) * v;

y1 = y_center + (y - y_center) * v;

try {

if (x1 > image.getWidth())

x1 = image.getWidth() * 2 - x1;

else if (x1 < 0)

x1 = -x1;

if (y1 > image.getHeight())

y1 = image.getHeight() * 2 - y1;

else if (y1 < 0)

y1 = -y1;

bimg.setRGB(x, y, image.getRGB((int) x1, (int) y1));

} catch (Exception e) {

}

}

}

}

(3)兩種效果的疊加

將兩種效果進行疊加,就產生了水泡的效果,疊加代碼如下:

public static BufferedImage drawBallImage(BufferedImage image, int x, int y, int radius) {

BufferedImage bimg = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);

Graphics2D g2 = bimg.createGraphics();

g2.drawImage(image, 0, 0, null);

int r = radius, x_lamp, y_lamp;

x_lamp = x - (int) (r / 2.0);

y_lamp = y - (int) (r / 2.0);

belbImage(image, bimg, x, y, r);

drawBall(bimg, x, y, r, x_lamp, y_lamp);

g2 = bimg.createGraphics();

g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.0f));

g2.drawImage(image, 0, 0, null);

g2.dispose();

return bimg;

}

代碼中使用到的輔助類Pixel代碼如下:

import java.awt.image.*;

public class Pixel {

public int red;

public int green;

public int blue;

public int alpha=0xFF;

public double hue;

public double saturation;

public double luminosity;

private int rgb;

public Pixel() {

}

public void setRGB(int rgb) {

red = (rgb & 0x00FF0000) / 0x00010000;

green = (rgb & 0x0000FF00) / 0x00000100;

blue = rgb & 0x000000FF;

alpha = (rgb >> 24)&0x0ff;

this.rgb = rgb;

}

public int getRGB() {

rgb = alpha<<24 | 0x00010000 * red | 0x00000100 * green | blue;

return this.rgb;

}

public static void setRgb(BufferedImage image, int x, int y, int red, int green, int blue) {

int rgb = 0xFF000000 | red * 0x00010000 | green * 0x00000100 | blue;

image.setRGB(x, y, rgb);

}

public static int pixelIntensity(int rgb) {

int red = (rgb&0x00FF0000)/0x00010000;

int green = (rgb&0x0000FF00)/0x00000100;

int blue = rgb&0x000000FF;

return (int) (0.299 * red + 0.587 * green + 0.114 * blue + 0.5);

}

}

測試代碼

本文上的效果圖片使用了下面的測試代碼:

public static void main(String[] argv) throws IOException {

BufferedImage img = read(new File("cat.jpg"));

BufferedImage img2 =drawBallImage(img, 100, 300, 80);

ImageIO.write(img2, "jpeg", new File("cat_belb.jpg"));

}

總結

以上是生活随笔為你收集整理的java水泡_JAVA图像处理系列(八)——艺术效果:水泡的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。