练习83浮雕效果
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
练习83 浮雕效果
一、练习具体要求
本练习制作彩色图片的浮雕效果。如图83-1所示,程序执行后,创建一个可以显示图片的面板,该面板显示彩色图片被处理后的浮雕效果,用黑白两种颜色勾勒出原图片的轮廓和细节。
二、程序及注释
(1)编程思路:首先,本练习因为要制作彩色图片的浮雕效果,所以首先要加载图片,:先通过语句URL imgURL = null实例化地址类URL,然后通过语句imgURL = new URL(getDocumentBase(), "sunflower.jpg")将一幅彩色图片加载到程序之中等待处理。然后,进行浮雕处理,首先通过实例化BufferedImage类创建一个缓冲区进行图片操作,再实例化BufferedImage类来创建一个图像缓冲区来存放经过浮雕处理后的图片,最后通过函数public void embossImage(BufferedImage srcImage, BufferedImage destImage) 对图片进行浮雕处理。
(2)程序实现及注释:
//Emboss.java
import java.awt.*;
import java.applet.*;
import java.awt.geom.*;
import java.awt.font.*;
import java.awt.image.*;
import .URL;
public class Emboss extends Applet
{
public void paint(Graphics g)
{
//实例化Graphics2D 类
Graphics2D newG = (Graphics2D) g;
//加载一幅图片并且显示
URL imgURL = null;
try {
imgURL = new URL(getDocumentBase(), "sunflower.jpg"); } catch (Exception ignore) {
}
Image img = getImage(imgURL);
MediaTracker tracker = new MediaTracker(this);
try {
tracker.addImage(img, 0);
tracker.waitForAll();
} catch (Exception e) {
e.printStackTrace();
}
//得到图片的尺寸
int width = img.getWidth(this);
int height = img.getHeight(this);
//创建一个缓冲区进行图片操作
BufferedImage buff = new BufferedImage(width,
height, BufferedImage.TYPE_INT_ARGB);
Graphics tempGr = buff.createGraphics();
tempGr.drawImage(img, 0, 0, this);
//创建一个图像缓冲区来存放经过浮雕处理后的图片
BufferedImage outBuff = new BufferedImage(width,
height, BufferedImage.TYPE_INT_ARGB);
embossImage(buff, outBuff);
newG.drawImage(outBuff, 100, 100, this);
}
//对图片进行浮雕处理
public void embossImage(BufferedImage srcImage, BufferedImage destImage) {
int width = srcImage.getWidth();
int height = srcImage.getHeight();
// 对每一个像素进行循环处理
for (int i=0; i < height; i++) {
for (int j=0; j < width; j++) {
//确认左右上下都为0
int upperLeft = 0;
int lowerRight = 0;
//左右
if ((i > 0) && (j > 0)) {
upperLeft = srcImage.getRGB(j-1, i-1)
& 0xffffff;
}
//上下
if ((i < height-1) && (j < width-1)) {
lowerRight = srcImage.getRGB(j+1, i+1)
& 0xffffff;
}
// 得到红色,绿色,蓝色之间的差别
int redDiff = ((lowerRight >> 16) & 255) -
((upperLeft >> 16) & 255);
int greenDiff = ((lowerRight >> 8) & 255) -
((upperLeft >> 8) & 255);
int blueDiff = (lowerRight & 255) -
(upperLeft & 255);
// 描绘出哪一种颜色的变化最大
int diff = redDiff;
if (Math.abs(greenDiff) > Math.abs(diff))
diff=greenDiff;
if (Math.abs(blueDiff) > Math.abs(diff))
diff=blueDiff;
// 将变化最大的颜色置为灰色
int greyColor = 128 + diff;
// 如果灰色过深或者过浅,改变到0-255之间的范围
if (greyColor > 255) greyColor = 255;
if (greyColor < 0) greyColor = 0;
//创建一种新的颜色
int newColor = 0xff000000 + (greyColor << 16) + (greyColor << 8) + greyColor;
destImage.setRGB(j, i, newColor);
}
}
}
}
三、练习效果(如图83-1所示)