黑色像素不是完全黑色?

时间:2012-01-09 10:50:59

标签: java image java-2d pixels

所以我试图制作一个仅由黑白像素组成的图像。我的问题是,当我放大并看到我可以查看黑色周围的一些灰色像素时,作为白色的一种过渡类型的东西。怎么/为什么会这样?

这是生成图片的代码:

public class DrawByPixelData extends JPanel{

Image img;

public DrawByPixelData(){

    int w = 10;
    int h = 10;

    int pixels[] = new int[w*h];

    for(int i=0;i<w*h;i++){
        if(i%7==0)
            pixels[i]=0xff000000;
            else
            pixels[i]=0xffffffff;
    }

    img = createImage(new MemoryImageSource(w,h,pixels,0,w));

}

public void paintComponent(Graphics g){

    g.drawImage(img,0,0,this);
}

public void saveTheImage(){

    SaveImageData sv = new SaveImageData();
    sv.SaveImage(img);
 }

保存图片的代码:

public class SaveImageData {

public void SaveImage(Image img){

    BufferedImage image = toBufferedImage(img);
    save(image, "jpg");
}

private BufferedImage toBufferedImage(Image img) {

    int w = img.getWidth(null);
    int h = img.getHeight(null);

    int type = BufferedImage.TYPE_BYTE_BINARY;
    BufferedImage dest = new BufferedImage(w,h,type);
    Graphics2D g2 = dest.createGraphics();
    g2.drawImage(img, 0, 0, null);
    g2.dispose();

    return dest;
}

private static void save(BufferedImage bi, String ext){

    String fileName = "New";
    File file = new File(fileName+"."+ext);

    try {
        ImageIO.write(bi, ext, file);
    } catch (IOException e) {
        System.out.println("Image didn't write: "+e.getMessage());
        e.printStackTrace();
    }       
}

是否因为我保存的格式?还是某种颜色模特的东西?

这是产生的图像。你也可以看到灰色像素。

enter image description here

感谢。

更改为png并关闭抗锯齿后的图像:

enter image description here

4 个答案:

答案 0 :(得分:2)

浏览器在缩放时自动应用抗锯齿:这不是图像的问题,你只是以错误的方式将其可视化。

尝试在Photoshop或GIMP等图像编辑器中打开它。不应出现灰色像素。

答案 1 :(得分:1)

我可以想到可能发生的两件事:抗锯齿和JPEG有损伪像。

  1. Anti-aliasing是通过在两种颜色的混合中绘制它们之间的中间像素来柔化颜色之间的边界的地方。

  2. JPEG images通常是有损,这意味着它们已被压缩,压缩可能会很好地抵制边界,使其不那么明显。

  3. 我没有立即在代码中看到任何有意做反抗锯齿的事情(这通常是一种有用的技术)但我不确定Graphics2D默认值是什么,所以你可能想要检查出来并且可能明确地关闭反锯齿(参见the documentation page顶部的讨论)。保存时,请将保存视为GIF或PNG,这是无损格式。

答案 2 :(得分:0)

这是因为您将图像写为JPEG文件,这是一种有损格式。它的压缩是为照片而构建的,而不是具有鲜明色彩边界的图像。它的压缩会在这些边界上产生微弱的“锯齿”,这就是你所看到的。你几乎肯定想要像PNG这样的无损索引格式。

答案 3 :(得分:0)

我没有通过你的代码确认它,但听起来你的图像是抗锯齿/压缩的; JPEG编码都支持这两种方式。

http://en.wikipedia.org/wiki/Spatial_anti-aliasing

  

在计算机图形学中,抗锯齿改善了多边形边缘的外观,因此它们不会“锯齿”,而是在屏幕上平滑。但是,它会导致显卡的性能成本并使用更多的视频内存。抗锯齿的程度决定了多边形边缘的平滑程度(以及它消耗的视频内存量)。

您可以在Graphics2D对象上启用/禁用抗锯齿:

 ig.setRenderingHint(RenderingHints.KEY_ANTIALIASING, // Anti-alias!
     RenderingHints.VALUE_ANTIALIAS_ON);

完整代码:http://www.java2s.com/Code/Java/2D-Graphics-GUI/AntiAlias.htm

我还建议您将文件输出为PNG,以确保JPEG压缩不会起作用:

ImageIO.write(bi, "png", outputfile);

完整代码:http://docs.oracle.com/javase/tutorial/2d/images/saveimage.html