Черные пиксели не совсем черные? - PullRequest
2 голосов
/ 09 января 2012

ТАК Я пытаюсь сделать изображение, состоящее только из черно-белых пикселей. Моя проблема в том, что когда я увеличиваю и вижу, я могу видеть некоторые серые пиксели вокруг черного, как нечто вроде переходного типа к белому. Как / почему это происходит?

Это код, который создает изображение:

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 ]

2 голосов
/ 09 января 2012

Браузеры автоматически применяют сглаживание при масштабировании: это не проблема изображения, вы просто визуализируете его неправильно.

Попробуйте открыть его в редакторе изображений, таком как Photoshop или GIMP.Не должно появляться серых пикселей.

1 голос
/ 09 января 2012

Я могу вспомнить две вещи: сглаживание и артефакты с потерями JPEG.

  1. Сглаживание - это то, где вы смягчаете границумежду цветами, рисуя промежуточные пиксели между ними в смеси двух цветов.

  2. JPEG-изображения обычно с потерями , что означает, что онисжимаются, и сжатие может стать границей сглаживания, чтобы сделать их менее заметными.

Я не вижу в вашем коде ничего, что специально делает сглаживание (частополезная техника), но я не уверен, какие значения по умолчанию Graphics2D, поэтому вы можете проверить это и, возможно, явно отключить сглаживание (см. обсуждение в верхней части на странице документации ).А при сохранении посмотрите на сохранение в формате GIF или PNG, которые являются форматами без потерь.

0 голосов
/ 09 января 2012

Я не подтвердил это через ваш код, но похоже, что ваше изображение сглаживается / сжимается; оба из которых поддерживаются в кодировке 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

0 голосов
/ 09 января 2012

Это потому, что вы пишете изображение в виде файла JPEG, который имеет формат с потерями. Его сжатие построено для фотографий, а не для изображений с четкими границами цвета. Его сжатие создаст слабое «алиасинг» на этих границах, что вы и видите. Вы почти наверняка хотите индексированный формат без потерь, такой как PNG.

...