В 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);
}
}
Что вы имеете в виду, если не работаете? – user3470953
Попробуйте напечатать значение 'bufferedImage'. Вы уверены, что он содержит альфа-канал? Не все типы изображений поддерживают прозрачность, и если это не так, установка альфа-'0', скорее всего, не будет иметь никакого эффекта. В качестве побочной заметки «0 << 24» также не действует, 0 равно 0 независимо. – haraldK
+1 для подсказки haraldK: Вы почти никогда не знаете тип изображения. Вы можете попытаться преобразовать изображение в тот, который определенно содержит альфа-канал, например. используя 'convertToARGB' из http://stackoverflow.com/questions/22391353/get-color-of-each-pixel-of-an-image-using-bufferedimages/22391951#22391951 – Marco13