Java 无法将两个图像并排渲染到正在更改的原始图像

Java 无法将两个图像并排渲染到正在更改的原始图像,java,image,graphics,awt,Java,Image,Graphics,Awt,我正在尝试创建一个程序,它可以打开两个相同尺寸的jpeg,并创建一个新的jpeg,将这两个图像并排放置,而不会改变枯萎图像 创建新图像的代码如下所示: public static Picture sumPicturesHorizontally(Picture left, Picture right) { BufferedImage newImage = new BufferedImage( left.getWidth() + right.getWidth(),

我正在尝试创建一个程序,它可以打开两个相同尺寸的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;
}
(图为我的一个包装器类,它包含一个BuffereImage和该映像的维度)

在大多数情况下,这是可行的。然而,输出的图像不仅仅是并排的左图像和右图像,似乎有什么东西在修改左图像和右图像之间的边界

我有一个黄色的正方形和一个红色的正方形;我的源图像是1恒定颜色。但是,总和图像在新边框周围有一些原始边框中没有的瑕疵。下面是我所说内容的放大截图:

如果在源图像上缩放到相同的级别,则在边缘上看不到相同的瑕疵。我希望它的边缘是黄色,然后是红色。黄色和红色不应该有不同的色调。是否有一些配置使其以这种方式运行,或者有不同的呈现方法?

另外,我通常不处理图形,这个边混合有什么名字吗?谢谢你的帮助

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

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;

我在网上找到了这个:

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;

您的代码正常,没有问题

没有缩放的图像也可以,没有瑕疵

“缩放”级别中唯一的问题是

进行缩放时,需要获得原始图像中没有的额外像素

该像素由算法计算,该算法使用两种颜色(红色和黄色像素)之间边缘附近的相邻像素来计算缩放图像中的新像素


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


注意:这就是为什么当你购买相机时,你需要询问它的分辨率,因为当分辨率增加时,即使你将相机缩放到这个级别,图像质量也会增加


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

1-

这是两幅没有任何缩放和伪影的图像

二,-


这是放大后的两幅图像,在这里我可以看到工件

您的代码正常,没有问题

没有缩放的图像也可以,没有瑕疵

“缩放”级别中唯一的问题是

进行缩放时,需要获得原始图像中没有的额外像素

该像素由算法计算,该算法使用两种颜色(红色和黄色像素)之间边缘附近的相邻像素来计算缩放图像中的新像素


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


注意:这就是为什么当你购买相机时,你需要询问它的分辨率,因为当分辨率增加时,即使你将相机缩放到这个级别,图像质量也会增加


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

1-

这是两幅没有任何缩放和伪影的图像

二,-


这是放大后的两幅图像,在这里我可以看到工件在Windows7上使用JDK7运行良好。发布你的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();
            }
        });
    }
}

对我来说,使用JDK7在Windows7上运行很好。发布你的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();
            }
        });
    }
}

当我查看源“原始大小”时,它们显然是一种颜色。然而,当我查看程序的输出时,即使在原始大小下,我也可以看到有不同颜色的像素行。我只是放大来强调这个问题,但当图像没有缩放时问题就出现了。请看我的编辑,我使用了你的代码,这是正常的,当我缩放它时,你的错误会显示出来,所以你能告诉我你使用的每个图像的宽度和高度吗?在图像中,你有1,我看到在图像的黄色部分有一排像素,它们有一种原始图像中没有的红色色调。它很微弱,但它就在那里。当我查看来源的“原始大小”时,它们显然是一种颜色。然而,当我查看程序的输出时,即使在原始大小下,我也可以看到有不同颜色的像素行。我只是放大来强调这个问题,但当图像没有缩放时问题就出现了。请看我的编辑,我使用了你的代码,这是正常的,当我缩放它时,你的错误会显示出来,所以你能告诉我你使用的每个图像的宽度和高度吗?在图像中,你有1,我看到在图像的黄色部分有一排像素,它们有一种原始图像中没有的红色色调。它很微弱,但它在那里。