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打开也是透明的啊!

学习一下……