我正在尝试创建一个程序,可以打开两个具有相同尺寸的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种恒定颜色。但是,总和图像在新边框周围有一些不在原始图像中的伪像。这是我正在谈论的放大屏幕截图:如果我在源图像上缩放到相同的水平,我看不到边缘上的相同瑕疵。我希望它只是黄色的边缘,然后只是红色。不应该有不同的黄色和红色。是否有一些配置使它以这种方式运行,或者是一种不同的渲染方法?
另外,我通常不使用图形,这个边缘融合的名称是什么名称?谢谢你的帮助!
答案 0 :(得分:4)
您的代码没问题,没有问题
你的图像没有缩放也没关系,没有任何文物
你做的“缩放”级别唯一的问题
进行缩放时,您需要获得不在原始图像中的其他像素
此像素是通过算法计算的,此算法使用两个颜色(红色和黄色像素)之间的边缘周围的邻居像素来计算缩放图像中的新像素
看到这张图片:它对特定部分进行缩放,你可以看到像方块一样,但在原始图像中你可以看到这是一个很小的像素
注意:这就是为什么当您购买相机时需要询问它的分辨率,因为即使您将变焦提升到此水平,分辨率提高时图像质量也会提高。
我使用了您的代码,这是输出:
1-
这是没有任何缩放且没有伪影的两个图像
2 -
这是放大后的两个图像,在这里我可以看到神器
答案 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;