最近做了给图片处理的程序,图片很简单,400×300,白底黑字,就在图片中间有一个黑字比如讧,想用程序给他加个阴影,但是问题频出,详细问题在程序下、 
package com; import java.awt.image.BufferedImage; 
import java.io.*; import javax.imageio.ImageIO; 
/**PNG图片文字加阴影(黑字白底) 
* 读取当前PNG的所有像素点, 
* 判断rgb是黑色的像素点, 
* 在该像素点偏移一定位置改变其像素为灰色(阴影), 
* 若阴影能覆盖到黑色像素则不改变此处的像素, 
* 把改变完的像素重新画到图片里 

*/ 
public class ImageRGB { 
public static void main(String args[]) { 
File file = new File( 
"C://Documents and Settings//Administrator//桌面//253.png"); 
BufferedImage bi = null; 
try { 
bi = ImageIO.read(file); 
} catch (Exception e) { 
e.printStackTrace(); 

int width = bi.getWidth(); 
int height = bi.getHeight(); 
int minx = bi.getMinX(); 
int miny = bi.getMinY(); 
System.out.println("width=" + width + ",height=" + height + "."); 
System.out.println("minx=" + minx + ",miniy=" + miny + "."); 
int r, g, b, n = 0; 
for (int i = minx; i < width; i++) { 
for (int j = miny; j < height; j++) { 
int pixel = bi.getRGB(i, j); 
r = (pixel & 0xff0000) >> 16;// red 
g = (pixel & 0xff00) >> 8;// green 
b = (pixel & 0xff);// blue 
if (r == 0 && g == 0 && b == 0) 

// System.out.println("原始的数据i=" + i + ",j=" + j + ":(" + r + 
// ","+ g + "," + b + ")"); 
n++; 
int p = bi.getRGB(i + 5, j + 5); 
r = (p & 0xff0000) >> 16;// red 
g = (p & 0xff00) >> 8;// green 
b = (p & 0xff);// blue 
if (r ==255&& g ==255 && b ==255) 

// System.out.println("现在的数据i=" +( i+5 )+ ",j=" + (j+5)+ ":(" 
// + r + ","+ g + "," + b + ")"); 
r = 120; 
g = 120; 
b = 120; 
p = (r < < 16) | (g < < 8) | b; 
bi.setRGB(i+5 , j+5, p); 
r = (p & 0xff0000) >> 16;// red 
g = (p & 0xff00) >> 8;// green 
b = (p & 0xff);// blue 
System.out.println("现在的数据i=" +( i+5 )+ ",j=" + (j+5)+ ":(" 
+ r + ","+ g + "," + b + ")"); 

} } } 
System.out.println(n); 
try { 
ImageIO.write(bi, "PNG", file); 
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} } 

问题:1,如果原图片是gif格式的,我用windows的画图工具另存为png的,再放到程序里用会出现数组越界异常 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds! 
at sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:301) 
at java.awt.image.BufferedImage.getRGB(BufferedImage.java:871) 
at com.ImageRGB.main(ImageRGB.java:45) 
如果原图是jpg的,做出来的阴影只是些星星点点的像素点,阴影字的笔画不连贯 
如果是png的,做出来的阴影正常。 
很迷惑,程序应该是没问题的,不知道是windows的画图另存为的问题?还是什么别的BUG? 
2,可能因为讧这个字简单,当把一个笔画比较复杂的字(png的)放进去做的时候还是会出想上面一样的异常,这是为什么? 
高手来指点! 
谢了。