1

我正在尝试创建一个可以打开两个具有相同尺寸的 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 恒定颜色。但是,总和图像在新边框周围有一些原始图像中没有的伪影。这是我正在谈论的放大屏幕截图: 在此处输入图像描述

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

4

3 回答 3

4

你的代码没问题

并且您没有缩放的图像也可以并且没有伪影

您所做的“缩放”级别中的唯一问题

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

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


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

在此处输入图像描述


注意:这就是为什么当您购买相机时需要询问其分辨率的原因,因为当分辨率提高时,即使您放大到这个级别,图像质量也会提高。


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

1-在此处输入图像描述

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

2-在此处输入图像描述

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

于 2013-04-13T17:46:21.750 回答
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();
            }
        });
    }
}
于 2013-04-13T19:10:51.880 回答
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;
于 2013-04-13T17:42:32.293 回答