У меня есть изображение с большим количеством сглаженных линий в нем и попытка удалить пиксели, которые опускаются ниже определенного порога альфа-канала (и что-то выше порогового значения преобразуется в полный 255 альфа). У меня это закодировано и работает, его просто не так быстро, как хотелось бы при запуске на больших изображениях. Кто-нибудь может предложить альтернативный метод?Java - удалять пиксели ниже определенного значения альфа
//This will convert all pixels with > minAlpha to 255
public static void flattenImage(BufferedImage inSrcImg, int minAlpha)
{
//loop through all the pixels in the image
for (int y = 0; y < inSrcImg.getHeight(); y++)
{
for (int x = 0; x < inSrcImg.getWidth(); x++)
{
//get the current pixel (with alpha channel)
Color c = new Color(inSrcImg.getRGB(x,y), true);
//if the alpha value is above the threshold, convert it to full 255
if(c.getAlpha() >= minAlpha)
{
inSrcImg.setRGB(x,y, new Color(c.getRed(), c.getGreen(), c.getBlue(), 255).getRGB());
}
//otherwise set it to 0
else
{
inSrcImg.setRGB(x,y, new Color(0,0,0,0).getRGB()); //white (transparent)
}
}
}
}
на комментарии @BenoitCoudour «s Я изменил код, соответственно, но, как представляется, влияет на результирующие значения RGB пикселей, любую идею, что я могу делать неправильно?
public static void flattenImage(BufferedImage src, int minAlpha)
{
int w = src.getWidth();
int h = src.getHeight();
int[] rgbArray = src.getRGB(0, 0, w, h, null, 0, w);
for (int i=0; i<w*h; i++)
{
int a = (rgbArray[i] >> 24) & 0xff;
int r = (rgbArray[i] >> 16) & 0xff;
int b = (rgbArray[i] >> 8) & 0xff;
int g = rgbArray[i] & 0xff;
if(a >= minAlpha) { rgbArray[i] = (255<<24) | (r<<16) | (g<<8) | b; }
else { rgbArray[i] = (0<<24) | (r<<16) | (g<<8) | b; }
}
src.setRGB(0, 0, w, h, rgbArray, 0, w);
}
Вы читаете ARBG, но записываете ARGB. Вы должны также прочитать ARGB. Другими словами, вы читаете зеленое значение в 'b', а синее значение -' g'. – erickson
Если ваш 'BufferedImage' имеет тип' TYPE_INT_ARGB', методы 'getRGB/setRGB (...)' излишне медленны. Быстрее обращаться к массиву данных резервного копирования напрямую. – haraldK