Java 无法将两个图像并排渲染到正在更改的原始图像
我正在尝试创建一个程序,它可以打开两个相同尺寸的jpeg,并创建一个新的jpeg,将这两个图像并排放置,而不会改变枯萎图像 创建新图像的代码如下所示: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(),
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,我看到在图像的黄色部分有一排像素,它们有一种原始图像中没有的红色色调。它很微弱,但它在那里。