使两个BufferedImages重叠并透明

时间:2014-07-16 21:30:49

标签: java bufferedimage overlap imagej

所以我搜索了这个问题并得到了很多点击,因此我能够提出下面显示的代码。我正在从ImageStack(ImageJ)拍摄图像,我想重叠两个以dicom格式(.dcm)的图像。我的问题是我希望两个图像都是透明的,因为它们相互重叠。我已经检查过图像是不同的,当传递到重叠功能,我已经尝试了很多东西,但我似乎无法使图像透明,它们重叠,但它们不透明。任何帮助将不胜感激。

  public BufferedImage overlay(BufferedImage bii, BufferedImage biii){
            BufferedImage combined = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
            Graphics2D go = combined.createGraphics();
            image.setSlice(5);
            ImagePlus hello = new ImagePlus();
            hello.setImage(image.getImage());
            BufferedImage bello = hello.getBufferedImage();
            go.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            go.drawImage(bii,0, 0, null);
            go.drawImage(biii,98, 98, null);
            go.setComposite(AlphaComposite.Clear); 
            go.setComposite(AlphaComposite.Src);
            //go.fillRect(0, 0, 256, 256);
            go.dispose();
            return combined;
        }

主要功能:

        ImageStack stack = image.getStack(); 
        Calibration cal = image.getCalibration(); 
        ImagePlus newImp = new ImagePlus( );
        stack.getSliceLabel(5);
        stack.getProcessor(5); 
        newImp.setCalibration( cal ); 
        ImageProcessor ip = stack.getProcessor(1); // specify number of slice 
        newImp.setProcessor(ip); 


        ImagePlus no3 = new ImagePlus();
        no3.setImage(newImp.getImage());
        BufferedImage bii= no3.getBufferedImage();

        ImagePlus bob = new ImagePlus( );
        stack.getSliceLabel(33);
        stack.getProcessor(33); 
        bob.setCalibration( cal ); 
        ImageProcessor bobp = stack.getProcessor(22); // specify number of slice 
        bob.setProcessor(bobp); 
        ImagePlus hello = new ImagePlus();
        hello.setImage(bob.getImage());
        BufferedImage bello = hello.getBufferedImage();

        BufferedImage overlayy = overlay(bii, bello);
        frame2 = new NFrame(image.getTitle(), image, save);
        JPanel pane = new JPanel(new BorderLayout());
        JLabel jLabel = new JLabel(new ImageIcon(overlayy));
        pane.add(jLabel);
        frame2.add(pane);
        frame2.setVisible(true);
        desktop.add(frame2);

1 个答案:

答案 0 :(得分:1)

ImageJ 1.x对透明(ARGB)彩色图像的支持有限(例如见here)。

修改ARGB图像的Alpha通道的一种方法是使用getChannel的{​​{1}}和setChannel方法。有关示例,请参阅this BeanShell script

通过将一个图像叠加在具有特定不透明度的另一个图像之上来组合两个图像的更简单方法是使用ImageJ的overlays。以下BeanShell script(将其移植到Java应该是直截了当的)是一个最小的例子,展示了两个图像的半透明组合:

ij.process.ColorProcessor

您可以通过将代码粘贴到Fiji's script editor,选择语言>来尝试脚本。 Beanshell ,然后按运行

这将是结果:

Result of running the beanshell script

要导出/保存图像,您应该运行 Image>覆盖>展平命令,或者在Java / Beanshell中:

import ij.IJ;
import ij.gui.ImageRoi;
import ij.gui.Overlay;

imp = IJ.openImage("http://imagej.nih.gov/ij/images/leaf.jpg");
imp2 = IJ.openImage("http://imagej.nih.gov/ij/images/clown.jpg");

ImageRoi roi = new ImageRoi(50, 200, imp2.getProcessor());
roi.setZeroTransparent(false);
roi.setOpacity(0.5);
ovl = new Overlay(roi);

imp.setOverlay(ovl);
imp.show();