最近做了给图片处理的程序,图片很简单,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的)放进去做的时候还是会出想上面一样的异常,这是为什么?
高手来指点!
谢了。
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的)放进去做的时候还是会出想上面一样的异常,这是为什么?
高手来指点!
谢了。
顶下。