2012-01-09 2 views
2

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

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

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

+0

Вы видите серые пиксели в этом маленьком изображении или когда вы увеличиваете масштаб изображения в браузере? – Viruzzo

+0

, когда я увеличиваю изображение. – Achint

+0

см. Ответ, который я разместил – Viruzzo

ответ

1

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

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

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

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

+0

Есть ли способ предотвратить сглаживание? Или это только формат? – Achint

+0

@Achint: я только что отредактировал ответ, я не уверен, что значения по умолчанию «Graphics2D», поэтому вы можете явно отключить сглаживание с помощью ['setRenderingHint'] (http://docs.oracle.com/ JavaSE/6/документы/API/Java/AWT/Graphics2D.html # setRenderingHint (java.awt.RenderingHints.Key,% 20java.lang.Object)). Но я думаю, что вы захотите использовать GIF или PNG в любом случае из-за потери JPG. –

+0

Хе, спасибо! Но нет ничего заметного различия, применяя эти вещи. Может быть, это что-то еще? Разве нет способа сделать четкие пиксели? – Achint

0

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

+0

Спасибо за ответ. Изменение типа расширения на PNG по-прежнему вызывает смягчение вокруг пикселей при масштабировании. Есть ли что-то еще, что я могу сделать неправильно или могу сделать, чтобы это предотвратить? – Achint

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

+0

Привет, спасибо, что ответили! Выключение сглаживания и изменение на png не создает заметной разницы. Разве нет способа, которым я могу создавать изображения с четкими различиями пикселей? – Achint

+0

Если это не сглаживание или сжатие, я не уверен, откуда возникают размытые пиксели. –

2

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

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

+0

Итак, вы имеете в виду, даже если я использую средство просмотра изображений Windows, оно автоматически применит его? – Achint

+0

В JPG действительно есть некоторые серые пиксели. Однако не PNG, это был действительно зритель, которого он использовал. –

+0

Да, формат JPEG также будет применять шум, так как это формат с потерями, но мы были над этим. – Viruzzo

Смежные вопросы