java 图片处理全集
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、图片的渐变效果
(在第一张图片的基础上渐变出第二张图片)
/** ShadowCanvas.java **/
class ShadowCanvas extends Canvas implements Runnable {
int w, h;
Image img2; //原始图片
Image srcImage; //渐变图片
int[] srcRgbImage; // 原始图片的像素数组
int[] shadowRgbImage; // 渐变图片的像素数组
int imgWidth, imgHeight;
int count;
/**原始图片只画一次即可此变量记录是否是第一次画原始图片*/
private boolean first = true;
public ShadowCanvas() {
w = this.getWidth();
h = this.getHeight();
try {
srcImage = Image.createImage("/logoBg.png");
img2 = Image.createImage("/test_bg.png");
} catch (IOException e) {
e.printStackTrace();
}
imgWidth = srcImage.getWidth();
imgHeight = srcImage.getHeight();
// 制造原始图片的像素数组,用一个int来代表每一个像素,按位表示方式是:0xAARRGGBB srcRgbImage = new
int[imgWidth * imgHeight];
// 获取原始图片的所有像素,参见MIDP APPI文档
srcImage.getRGB(srcRgbImage, 0, imgWidth, 0, 0, imgWidth, imgHeight);
shadowRgbImage = new
int[srcRgbImage.length];
System.arraycopy(srcRgbImage, 0, shadowRgbImage, 0, shadowRgbImage.length); // 渐变图片的所有像素一开始都是全透明的
for (int i = 0; i < shadowRgbImage.length; i++) {
shadowRgbImage &= 0x00ffffff;
}
new Thread(this).start();
}
public void paint(Graphics g) {
// g.setColor(0, 0, 0);
// g.fillRect(0, 0, w, h);
if(first){
g.drawImage(img2, 0, 0, 0);
first = false;
}
// 绘制渐变图片
g.drawRGB(shadowRgbImage, 0, imgWidth, (w - imgWidth) / 2,
(h - imgHeight) / 2, imgWidth, imgHeight, true);
// g.setColor(0, 255, 0);
// g.drawString("count=" + count, w / 2, 30, Graphics.HCENTER
// | Graphics.TOP);
}
public void run() {
while (true) {
boolean changed = false;
// 改变渐变图片的每一个像素
for (int i = 0; i < shadowRgbImage.length; i++) {
// 获取渐变图片的某一像素的alpha值
int alpha = (shadowRgbImage & 0xff000000) >>> 24;
// 原始图片的对应像素的alpha值
int oldAlpha = (srcRgbImage & 0xff000000) >>> 24;
if (alpha < oldAlpha) {
// alpha值++ 写的太精妙了把移位用到了极致
shadowRgbImage = ((alpha + 1) << 24)
| (shadowRgbImage & 0x00ffffff);
changed = true;
}
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
count ++;
repaint();
// 当所有像素的alpha值都达到原始值后,线程运行结束
if (!changed) {
System.out.println("over");
break;
}
}
}
}
二、图片的基本处理
public class ImageUtil
{
public static final int TURN_LEFT = 1;
public static final int TURN_RIGHT = 2;
/*
*获取图片RGB数据,并返回大小为width*height大小的一维数组
*/
public int[] getPixels(Image src)
{
int w = src.getWidth();
int h = src.getHeight();
int[] pixels = new
int[w * h];
src.getRGB(pixels, 0, w, 0, 0, w, h);
return pixels;
}
/*
*将pixels[]里的数据,生成一张图片,图片宽为w,高为h
*/
public Image drawPixels(int[] pixels, int w, int h)
{
Image image = Image.createRGBImage(pixels, w, h, true);
pixels = null;
return image;
}
/*
*调整图片大小
*destW 调整后的宽,destH调整后的高
*/
public Image effect_resizeImage(Image src, int destW, int destH)
{
int srcW = src.getWidth();
int srcH = src.getHeight();
int[] destPixels = new
int[destW * destH];
int[] srcPixels = getPixels(src);
for (int destY = 0; destY < destH; ++destY)