首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法并排渲染2张正在更改的原始图像

无法并排渲染2张正在更改的原始图像
EN

Stack Overflow用户
提问于 2013-04-14 01:30:51
回答 3查看 1.3K关注 0票数 1

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

创建新图像的代码如下:

代码语言:javascript
复制
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个恒定的颜色。但是,sum图像在新边框周围有一些不在原始边框中的伪像。以下是我正在讨论的内容的放大屏幕截图:

如果我在源图像上缩放到相同的级别,我在边缘上看不到相同的伪影。我希望它是黄色的边缘,然后是红色的。不应该有不同深浅的黄色和红色。有没有一些配置可以让它以这种方式运行,或者是一种不同的呈现方法?

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

EN

回答 3

Stack Overflow用户

发布于 2013-04-14 01:46:22

您的代码是正常的,没有任何问题

没有缩放的图像也没问题,没有伪影

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

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

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

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

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

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

1-

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

2-

这是两张放大后的图像,我可以在这里看到伪像

票数 4
EN

Stack Overflow用户

发布于 2013-04-14 03:10:52

我在使用JDK7的Windows7上运行得很好。发布你的SSCCE,这样我们就可以确切地看到你是如何测试的。

这是我使用的SSCCE:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-04-14 01:42:32

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

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15990748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档