无法将2张图像并排渲染原始图像

时间:2013-04-13 17:30:51

标签: java image graphics awt

我正在尝试创建一个程序,可以打开两个具有相同尺寸的jpeg,并创建一个新的jpeg,将这两个图像并排放置,不会对图像进行任何更改。

创建新图像的代码是:

public static Picture sumPicturesHorizontally(Picture left, Picture right) {

    BufferedImage newImage = new BufferedImage(
            left.getWidth() + right.getWidth(), 
            left.getHeight(), 
            left.getImage().getType());

    Graphics2D g = (Graphics2D) newImage.getGraphics();
    g.drawImage(left.getImage(), 0, 0, null);
    g.drawImage(right.getImage(), left.getWidth(), 0, null);

    Picture p = new Picture(newImage);
    return p;
}

(想象一下我的包装类,包含BufferedImage和图像的尺寸)

在大多数情况下,这是有效的。但是,输出的图像不仅仅是左右图像并排,似乎有些东西正在修改左右图像之间的边界。

我有一个黄色方块和一个红色方块;我的源图像是1种恒定颜色。但是,总和图像在新边框周围有一些不在原始图像中的伪像。这是我正在谈论的放大屏幕截图: enter image description here

如果我在源图像上缩放到相同的水平,我看不到边缘上的相同瑕疵。我希望它只是黄色的边缘,然后只是红色。不应该有不同的黄色和红色。是否有一些配置使它以这种方式运行,或者是一种不同的渲染方法?
另外,我通常不使用图形,这个边缘融合的名称是什么名称?谢谢你的帮助!

3 个答案:

答案 0 :(得分:4)

您的代码没问题,没有问题

你的图像没有缩放也没关系,没有任何文物

你做的“缩放”级别唯一的问题

进行缩放时,您需要获得不在原始图像中的其他像素

此像素是通过算法计算的,此算法使用两个颜色(红色和黄色像素)之间的边缘周围的邻居像素来计算缩放图像中的新像素


看到这张图片:它对特定部分进行缩放,你可以看到像方块一样,但在原始图像中你可以看到这是一个很小的像素

enter image description here


注意:这就是为什么当您购买相机时需要询问它的分辨率,因为即使您将变焦提升到此水平,分辨率提高时图像质量也会提高。


我使用了您的代码,这是输出:

1- enter image description here

这是没有任何缩放且没有伪影的两个图像

2 - enter image description here

这是放大后的两个图像,在这里我可以看到神器

答案 1 :(得分:1)

使用JDK7在Windows 7上正常工作。发布您的SSCCE,以便我们可以确切地了解您如何测试它。

这是我使用过的SSCCE:

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class MergeImageSSCCE extends JPanel
{
    public MergeImageSSCCE()
    {
        setLayout( new FlowLayout() );
        int size = 100;

        Image left = createImage(size, Color.YELLOW);
        Image right = createImage(size, Color.RED);
        Image merged = merge(left, right);

        add( new JLabel( new ImageIcon(left) ) );
        add( new JLabel( new ImageIcon(right) ) );
        add( new JLabel( new ImageIcon(merged) ) );
    }


    public static Image createImage(int size, Color color)
    {
        BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        g.setColor( color );
        g.fillRect(0, 0, size, size);
        g.dispose();

        return image;
    }

    public static Image merge(Image left, Image right)
    {
        BufferedImage merged = new BufferedImage(
            left.getWidth(null) + right.getWidth(null), left.getHeight(null), BufferedImage.TYPE_INT_RGB);
        Graphics2D g = (Graphics2D) merged.getGraphics();
        g.drawImage(left, 0, 0, null);
        g.drawImage(right, left.getWidth(null), 0, null);

        return merged;
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("MergeImageSSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new MergeImageSSCCE() );
        frame.setSize(250, 250);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

答案 2 :(得分:0)

我在互联网上找到了这个:

System.Drawing.Image thumbnail = new Bitmap(width, height, PixelFormat.Format32bppArgb);
Graphics graphic = Graphics.FromImage(thumbnail);

graphic.CompositingQuality = CompositingQuality.HighQuality;
graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphic.PixelOffsetMode = PixelOffsetMode.Half;