2016-12-09 9 views
0

Я хочу преобразовать изображение из цветного в черно-белое, которое создается с нуля. Вот код, который я попробовал, как описано на другую должность:Конвертировать цветное изображение в черно-белое с помощью java, созданного с нуля

BufferedImage bi = ImageIO.read(new File("/Users/***/Documents/Photograph.jpg")); 
    ColorConvertOp op = 
     new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null); 
    ImageIO.write(bi, "PNG", new File("/Users/bng/Documents/rendered2.png")); 
    op.filter(bi, bi); 

Но все-таки мой образ не превращается в черный и белый. Кроме того, этот код увеличивает размер изображения rendered2.png до 10 раз. Кроме того, было бы здорово, если бы я смог найти способ Java 8 для этого. Любые предложения?

+0

Я бы уточнил результат, который вы хотите иметь. Черно-белое изображение имеет только два цвета, также называемое бинарным изображением. Изображение в градациях серого (которое вы пытаетесь создать с помощью ColorSpace.CS_GRAY) имеет больше цветов, чем два. – Mathias

ответ

0
  1. Вы должны найти RGB существующих цветов изображения, которое хотите изменить.
  2. Fyi, вы хотите изменить его в виде белого значения RGB является (255255255) и черного цвета RGB является (0,0,0)

  3. Следуя методу легко сделать изменение цвета, если применить правильный путь ваше требование

    private BufferedImage changeColor(BufferedImage image, int srcColor, int replaceColor) 
    { 
        BufferedImage destImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); 
        Graphics2D g = destImage.createGraphics(); 
        g.drawImage(image, null, 0, 0); 
        g.dispose(); 
    
    
        for (int width = 0; width < image.getWidth(); width++) 
        { 
         for (int height = 0; height < image.getHeight(); height++) 
         { 
    
          if (destImage.getRGB(width, height) == srcColor) 
          { 
           destImage.setRGB(width, height, replaceColor); 
          } 
    
         } 
        } 
    
        return destImage; 
    } 
    
+0

Это изменило изображение на черно-белое, но не делает его выполненным с нуля. – KayV

+0

вам нужно просто создать изображение, проверить онлайн несколько доступных источников. –

0

вы должны использовать ColorConvertOp надлежащим образом:

  1. создать источник Изображение
  2. применить фильтр
  3. сохранить Dest

пример:

BufferedImage src = ImageIO.read(new File("/Users/***/Documents/Photograph.jpg")); 

ColorConvertOp op = 
    new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null); 
BufferedImage dest = op.filter(src, null); 

ImageIO.write(dest, "PNG", new File("/Users/bng/Documents/rendered2.png")); 

ЦСИ: enter image description here

Dest: enter image description here

+1

если вам нравится ** однострочный ** вы можете сделать 'ImageIO.write (новый ColorConvertOp (ColorSpace.getInstance (ColorSpace.CS_GRAY), null) .filter (ImageIO.read (новый файл ("/Users/*** /Documents/Photograph.jpg ")), null)," PNG ", новый файл ("/Users/bng/Documents/rendered2.png "));' –

+0

Ваш один лайнер хорош. Как-то не конвертирует изображение с нуля. Поиск некоторых других параметров. – KayV

+1

'ColorSpace.CS_GRAY' создает ** серое изображение ** не ** черно-белое изображение ** ... –

0

Вот код, который ш orked для меня:

BufferedImage input = ImageIO.read(new File("/Users/bng/Documents/Photograph.jpg")); 
    // Create a black-and-white image of the same size. 
    BufferedImage im = new BufferedImage(input.getWidth(), input.getHeight(), BufferedImage.TYPE_BYTE_BINARY); 
    // Get the graphics context for the black-and-white image. 
    Graphics2D g2d = im.createGraphics(); 
    // Render the input image on it. 
    g2d.drawImage(input, 0, 0, null); 
    // Store the resulting image using the PNG format. 
    ImageIO.write(im, "PNG", new File("/Users/bng/Documents/rendered.png")); 

Это был BufferedImage.TYPE_BYTE_BINARY, который предоставил мне точное решение. Lokking для версии Java 8 для вышеуказанного кода.

+0

Как это создает изображение в градациях серого (черно-белое)? –

+0

Это TYPE_BYTE_BINARY, который дает свой черно-белый цвет, как указано «nt java.awt.image.BufferedImage.TYPE_BYTE_BINARY = 12 [0xc] Представляет непрозрачное байт-упакованное 1, 2 или 4-битное изображение. Изображение имеет IndexColorModel без альфы. Когда этот тип используется как аргумент imageType для конструктора BufferedImage, который принимает аргумент imageType, но не аргумент ColorModel, создается 1-битное изображение с помощью IndexColorModel с двумя цветами в стандартном sRGB ColorSpace: {0, 0, 0} и {255, 255, 255}. « – KayV

+0

Умм - не обижайтесь, извините, не значит быть грубым .... –