C/C++可以实现一个这样的功能:
两张一样大的图片,
A是一个黑色背景的小图形,
B是黑白两色,其中白色的形状正好是A中图形的形状,用这两张图片可以切出A中的图像(正好把A中的黑色背景去掉),就像PS里面的抠图一样。这样切出来的图形就是不带背景的,可以方便再处理。请问JAVA中怎么实现?

解决方案 »

  1.   

    import java.awt.*;
    import java.awt.geom.*;
    import javax.swing.*;public class TestImageClip extends JPanel {
        Image img = null;
        boolean isClip;
        Area picture = null, area = null;    public TestImageClip(Image img, boolean isClip) {
            this.isClip = isClip;
            this.img = img;        area= 
                new Area(
                    new GeneralPath(
                        new Rectangle2D.Float(100, 100, 200, 200)));        picture = 
                new Area(
                    new GeneralPath(
                        new Rectangle(0, 0,
                            img.getWidth(this),
                            img.getHeight(this))));
        }    public void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D)g;        if (isClip) {
                area.subtract(picture);            
                g2.setClip(area);
            }        g2.drawImage(img, 0, 0, this);
        }    public static void main(String[] args) {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setPreferredSize(
                new Dimension(500, 400));        boolean isClip = true;        if (args.length == 0) {
                System.out.println(
                    "Usage: java TestImageClip <img pathName> [ture|false]");
                System.exit(0);
            } else if (args.length == 2) {
                isClip = Boolean.parseBoolean(args[1]);
            }        Image img = Toolkit.getDefaultToolkit().getImage(args[0]);
            
            Container container = frame.getContentPane();
            TestImageClip test = new TestImageClip(img, isClip);        container.add(test);        frame.pack();
            frame.setVisible(true);
        }
    }
      

  2.   

    TO :UnAgain() 要的是两个图片互切啊!如果是切颜色,A图片也有黑色不分啊!主要是在B中通过识别某个颜色计算好要切的部分,
    然后拿这个计算出来的“部分”去切A
      

  3.   

    贴了以后,我也注意到一些问题,不过这几天忙别的了,没顾上。我这个程序只是改变了绘图区的大小,对图像及其文件没作任何改动。我想可能没有满足你的需求。你说的我大致明白了,用java是可以实现的,不过要等几天了。
      

  4.   

    不好意思,爽约了。
    这个问题有点难度,最近又有别的事,所以短时间内解决不了了。我对image的操作不熟,了解一点。大致知道所有的有关Image的处理集中在包java.awt.image 里面,另外java.awt里面也有几个,象Graphics,Graphics2D,还有AlphaComposite等。因为对你的需求有疑问,我考虑解决你这个问题的有两个思路。 
    下面用mold表示图片B,pic表示图片A一种直接在pic上选择想去除的颜色,换成你自己希望的颜色,类似于MS Painter画笔中的墨水瓶功能。从而达到要求。二是先用第一种方法改变mold的颜色,将颜色置为透明,从而得到形状。然后再用剩余部分与pic合成,达到最终要求。到目前为止,我估计使用java.awt.image.ColorConvertOp还有java.awt.AlphaComposite能实现上述功能,但确实没有这方面的经验。虽然很感兴趣,但最近一段时间顾不上研究这块儿了。关注。
      

  5.   

    我的思路是这样的,先把B图片对应A图片中要保留得部分透明,然后和A图片进行异或操作。
      

  6.   

    楼上的说的不行先把B图片对应A图片中要保留得部分处理掉再用处理后的B去处理A以前见过C++的代码
    现在找不到了
      

  7.   

    你还不如找点资料,学习学习呢
    我刚翻译几篇image的文章,介绍的是随同jdk发布的java.image
    http://blog.csdn.net/Unagain另外,sun提供了jai可以对图像进行高级操作。
      

  8.   

    是把第一张图片的背景置白色吗?
    我这里有图片格式转换已经缩放的代码,也有设置背景色的。
    http://blog.csdn.net/kaukiyou/archive/2006/03/30/644757.aspx