2014-08-17 2 views
0

В Java я прочитал изображение, а затем пройти через пиксели, и если его цвето расстояние < 30, то я хочу, чтобы очистить изображение, изменяя его альфа 0. Это мой код:Как очистить пиксель BufferedImage в java?

Но это не работает. Это не имеет никакого эффекта ...

Кто-нибудь видит проблему?

Благодаря

import java.awt.Color; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import javax.imageio.ImageIO; 

public class Recognize { 

    public static void main(String args[]) throws IOException { 

     Path path = Paths.get("images/fish.png"); 
     File file = path.toFile(); 

     if (file.exists()) { 
      InputStream stream = Files.newInputStream(path); 
      BufferedImage bufferedImage = ImageIO.read(stream); 

      int width = bufferedImage.getWidth(); 
      int height = bufferedImage.getHeight(); 

      if (width > 0 && height > 0) { 
       int TLpixel = bufferedImage.getRGB(0, 0); 
       Color TLcolor = new Color(TLpixel); 

       for (int i = 0; i < width; i++) { 
        for (int j = 0; j < height; j++) { 
         int pixel = bufferedImage.getRGB(i, j); 
         Color color = new Color(pixel); 
         double distance = ColourDistance(TLcolor, color); 
         //System.out.println(distance); 

         if (distance < 30) { 
          int mc = (0 << 24) | 0x00ffffff; 
          int newcolor = pixel & mc; 
          bufferedImage.setRGB(i, j, newcolor);  
         } 
        } 
       } 



       File outputfile = new File("images/fish_new.png"); 
       ImageIO.write(bufferedImage, "png", outputfile); 

      } 
     } 
    } 

    public static int[] printPixelARGB(int pixel) { 
     int alpha = (pixel >> 24) & 0xff; 
     int red = (pixel >> 16) & 0xff; 
     int green = (pixel >> 8) & 0xff; 
     int blue = (pixel) & 0xff; 
     return new int[] {red, green, blue, alpha}; 
    } 

    public static double ColourDistance(Color c1, Color c2) { 
     double rmean = (c1.getRed() + c2.getRed())/2; 
     int r = c1.getRed() - c2.getRed(); 
     int g = c1.getGreen() - c2.getGreen(); 
     int b = c1.getBlue() - c2.getBlue(); 
     double weightR = 2 + rmean/256; 
     double weightG = 4.0; 
     double weightB = 2 + (255-rmean)/256; 
     return Math.sqrt(weightR*r*r + weightG*g*g + weightB*b*b); 
    } 
} 
+0

Что вы имеете в виду, если не работаете? – user3470953

+1

Попробуйте напечатать значение 'bufferedImage'. Вы уверены, что он содержит альфа-канал? Не все типы изображений поддерживают прозрачность, и если это не так, установка альфа-'0', скорее всего, не будет иметь никакого эффекта. В качестве побочной заметки «0 << 24» также не действует, 0 равно 0 независимо. – haraldK

+0

+1 для подсказки haraldK: Вы почти никогда не знаете тип изображения. Вы можете попытаться преобразовать изображение в тот, который определенно содержит альфа-канал, например. используя 'convertToARGB' из http://stackoverflow.com/questions/22391353/get-color-of-each-pixel-of-an-image-using-bufferedimages/22391951#22391951 – Marco13

ответ

1

Под «поляну» пикселя, вы, очевидно, имел в виду «чтобы сделать пиксель прозрачным».

Для того, чтобы сделать прозрачный пиксель, изображение должно соответствовать support прозрачных пикселей. Независимо от того, поддерживает ли BufferedImage прозрачные пикселы, зависит от типа от BufferedImage. После загрузки BufferedImage с ImageIO вы вряд ли знаете тип изображения. Но вы можете легко преобразовать изображение в изображение с известным типом (поддерживающим прозрачность), передав его методу следующего вида:

public static BufferedImage convertToARGB(BufferedImage image) 
{ 
    BufferedImage newImage = new BufferedImage(
     image.getWidth(), image.getHeight(), 
     BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g = newImage.createGraphics(); 
    g.drawImage(image, 0, 0, null); 
    g.dispose(); 
    return newImage; 
} 
Смежные вопросы