Java创建和读取RGB像素值不同
我尝试从rgb值创建图像,这是我的代码:Java创建和读取RGB像素值不同,java,image,colors,rgb,Java,Image,Colors,Rgb,我尝试从rgb值创建图像,这是我的代码: try { BufferedImage img = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB); for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { Color clc = new Color(40, 21, 60);
try {
BufferedImage img = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
Color clc = new Color(40, 21, 60);
int rgb = clc.getRGB();
img.setRGB(i, j, rgb);
}
}
// retrieve image
File outputfile = new File("D:\\saved.jpg");
ImageIO.write(img, "jpg", outputfile);
} catch (IOException e) {
}
试试看{
BuffereImage img=新的BuffereImage(5,5,BuffereImage.TYPE_INT_RGB);
对于(int i=0;i<5;i++){
对于(int j=0;j<5;j++){
颜色clc=新颜色(40,21,60);
int rgb=clc.getRGB();
img.setRGB(i,j,rgb);
}
}
//检索图像
File outputfile=新文件(“D:\\saved.jpg”);
写入(img,“jpg”,outputfile);
}捕获(IOE异常){
}
我创建彩色图像,红色=40,绿色=21,蓝色=60
创建图像后,我再次尝试获取像素。但当我创建时,输出像素与rgb值不同。
这是我获取rgb值的代码:
public static void main(String[] args){
try {
BufferedImage bf = ImageIO.read(new File("D:\\saved.jpg"));
RGB(bf);
} catch (IOException ex) {
Logger.getLogger(ektract.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void RGB(BufferedImage end)
{
System.out.println("GREEN");
System.out.println("====");
for (int y = 0; y < end.getHeight(); y++)
{
for (int x = 0; x < end.getWidth(); x++)
{
int rgb = end.getRGB(x, y);
int red = (rgb >> 16) & 0x000000FF;
int green = (rgb >>8 ) & 0x000000FF;
int blue = (rgb) & 0x000000FF;
System.out.print(red+" "+green+" "+blue+" ");
}
System.out.println();
}
}
publicstaticvoidmain(字符串[]args){
试一试{
BuffereImage bf=ImageIO.read(新文件(“D:\\saved.jpg”);
RGB(bf);
}捕获(IOEX异常){
Logger.getLogger(ektract.class.getName()).log(Level.SEVERE,null,ex);
}
}
公共静态无效RGB(BuffereImage端)
{
System.out.println(“绿色”);
System.out.println(“=”);
对于(int y=0;y>16)和0x000000FF;
绿色整数=(rgb>>8)&0x000000FF;
蓝色整数=(rgb)&0x000000FF;
系统输出打印(红色+“”+绿色+“”+蓝色+“”);
}
System.out.println();
}
}
这个输出:
GREEN
====
39 21 59 39 21 59 39 21 59 39 21 59 39 21 59
39 21 59 39 21 59 39 21 59 39 21 59 39 21 59
39 21 59 39 21 59 39 21 59 39 21 59 39 21 59
39 21 59 39 21 59 39 21 59 39 21 59 39 21 59
39 21 59 39 21 59 39 21 59 39 21 59 39 21 59
绿色
====
39 21 59 39 21 59 39 21 59 39 21 59 39 21 59
39 21 59 39 21 59 39 21 59 39 21 59 39 21 59
39 21 59 39 21 59 39 21 59 39 21 59 39 21 59
39 21 59 39 21 59 39 21 59 39 21 59 39 21 59
39 21 59 39 21 59 39 21 59 39 21 59 39 21 59
请你能帮帮我吗。
谢谢JPEG是一种“有损”格式。保存到JPEG并重新加载后,颜色可能不完全相同。改用PNG。例如,以下是SSCCE的输出<代码>0表示相同的颜色,而
-
表示不同的颜色
JPG
--------------------
--------------------
--------------------
--------------------
--------------------
--------------------
PNG
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
代码
import java.awt.*;
导入java.awt.image.buffereImage;
导入java.io.*;
导入javax.imageio.imageio;
类图像像素比较{
专用静态缓冲区图像转换器ImageToFormat(
BuffereImage img,字符串类型)引发IOException{
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
ImageIO.write(img,type,baos);
ByteArrayInputStream bais=新的ByteArrayInputStream(baos.toByteArray());
BuffereImage encodedImage=ImageIO.read(BAI);
返回图像;
}
专用静态void compareImagesByPixel(BuffereImage bi1、BuffereImage bi2){
对于(int ii=0;ii似乎只有1关。在创建图像之前,请尝试打印RGB值-它们相同吗?通常值介于0-255之间。也许它与jpg压缩有关?而且您不需要在循环的每次迭代中创建新的颜色对象,只需在嵌套loo之外定义颜色对象即可p、 @HectorLector“…您不需要创建新的颜色对象…”我猜OP可能希望对不同的像素使用不同的颜色。他只是简化了代码以提供一个简单的示例。如果这有助于解决问题,请联系我们。
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
class ImagePixelComparison {
private static BufferedImage convertImageToFormat(
BufferedImage img, String type) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, type, baos);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
BufferedImage encodedImage = ImageIO.read(bais);
return encodedImage;
}
private static void compareImagesByPixel(BufferedImage bi1, BufferedImage bi2) {
for (int ii=0; ii<bi1.getHeight(); ii++) {
for (int jj=0; jj<bi1.getWidth(); jj++) {
boolean b = bi1.getRGB(jj, ii)==bi2.getRGB(jj, ii);
String s = (b ? "0" : "-");
System.out.print(s);
}
System.out.println();
}
}
public static void main(String[] args) throws IOException {
BufferedImage originalImage =
new BufferedImage(20,6,BufferedImage.TYPE_INT_RGB);
Graphics2D g = originalImage.createGraphics();
g.setColor(Color.RED);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.drawLine(0, 0, 20, 6);
g.dispose();
System.out.println("JPG");
BufferedImage jpegImage = convertImageToFormat(originalImage, "jpg");
compareImagesByPixel(originalImage,jpegImage);
System.out.println("PNG");
BufferedImage pngImage = convertImageToFormat(originalImage, "png");
compareImagesByPixel(originalImage,pngImage);
}
}