java在缩小处理png,gif等有透明背景图片时,怎么让生成的图片保持透明的背景?
java在缩小处理png,gif等有透明背景图片时,怎么让生成的图片保持透明的背景?我现在得到的缩小的图片背景都是黑色的.希望大家帮忙解决一下啊~~
[b]问题补充:[/b]
谢谢两位了~~但是还是没解决我的问题啊~~,我是想把一张背景原本是透明的png或者gif的图片,缩小之后生成的图片背景仍然是透明的。现在生成的图片还是黑色背景的。
[b]问题补充:[/b]
回“小疯子”:现在png图片的我已经用其他方法解决了,不过gif还是不行,你可以处理gif的么??或者有另外更好的方法?
[b]问题补充:[/b]
谢谢“小疯子”了,问题解决了~~!!
先说声sorry.我的代码中GraphicsUtilities这个类不是jdk自带的.改了下:
[code="java"]public static void main(String[] args) throws IOException {
URL resource = ImageSwing.class.getResource("./Kitty_xs013.gif");
BufferedImage sourceImage = ImageIO.read(resource);
BufferedImage dstImage = null;
AffineTransform transform = AffineTransform.getScaleInstance(0.5, 0.5);// 返回表示缩放变换的变换
AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
dstImage = op.filter(sourceImage, null);
/********** save到本地 *****************/
try {
ImageIO.write(dstImage, "png", new File("D:\\a.gif"));
} catch (IOException e) {
e.printStackTrace();
}
/********** save end *****************/
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.add("Source Transform", new JLabel(new ImageIcon(sourceImage)));
tabbedPane.add("Affine Transform", new JLabel(new ImageIcon(dstImage)));
JFrame jframe = new JFrame();
jframe.setSize(800, 600);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.getContentPane().add(tabbedPane);
jframe.setVisible(true);
}[/code]我试了下, 在save代码块中, 如果用[code="java"]ImageIO.write(dstImage, "gif", new File("D:\\a.gif"));[/code]的确是黑色背景的, 但是如果用[code="java"]ImageIO.write(dstImage, "png", new File("D:\\a.gif"));[/code]的就是透明的了, 也就是说存的时候始终存成png的格式, 不知道你是怎么存的, 可以指定格式么?
[code="java"]/**
*
* @param filesrc
* @param logosrc
* @param outsrc
* @param x 位置
* @param y 位置
*/
public void composePic(String filesrc,String logosrc,String outsrc,int x,int y) {
try {
File bgfile = new File(filesrc);
Image bg_src = javax.imageio.ImageIO.read(bgfile);
File logofile = new File(logosrc);
Image logo_src = javax.imageio.ImageIO.read(logofile);
int bg_width = bg_src.getWidth(null);
int bg_height = bg_src.getHeight(null);
int logo_width = logo_src.getWidth(null);;
int logo_height = logo_src.getHeight(null);
BufferedImage tag = new BufferedImage(bg_width, bg_height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = tag.createGraphics();
g2d.drawImage(bg_src, 0, 0, bg_width, bg_height, null);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f)); //透明度设置开始
g2d.drawImage(logo_src,x,y,logo_width,logo_height, null);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); //透明度设置 结束
FileOutputStream out = new FileOutputStream(outsrc);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag);
out.close();
}catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
Long star = System.currentTimeMillis();
TwoComposePic pic = new TwoComposePic();
pic.composePic("c:\bb.gif","c:\bc.gif","c:\out_pic.gif",490,360);
Long end =System.currentTimeMillis();
System.out.print("time====:"+(end-star));
} [/code]
还是看这里吧
http://www.blogjava.net/Alpha/archive/2007/08/20/138171.html
另外,你还可以使用一些现成的处理图片的库,
http://www.gurge.com/amd/old/java/GIFEncoder/index.html
我也贴一个,线性缩放的
[code="java"]public class ImageSwing {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
URL resource = ImageSwing.class.getResource("./images/protected.png");
BufferedImage sourceImage = GraphicsUtilities.loadCompatibleImage(resource);
BufferedImage dstImage = null;
AffineTransform transform = AffineTransform.getScaleInstance(0.5, 0.5);// 返回表示缩放变换的变换
AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
dstImage = op.filter(sourceImage, null);
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.add("Source Transform", new JLabel(new ImageIcon(sourceImage)));
tabbedPane.add("Affine Transform", new JLabel(new ImageIcon(dstImage)));
JFrame jframe = new JFrame();
jframe.setSize(800, 600);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.getContentPane().add(tabbedPane);
jframe.setVisible(true);
}
}[/code]
不知道楼主是用什么方法保存的, 我是用ImageIO保存的:
[code="java"]try {
ImageIO.write(dstImage, "png", new File("D:\a.png"));
} catch (IOException e) {
e.printStackTrace();
}[/code]
并且用photoshop打开也是透明的啊!
学习一下……