Создание 8-битного изображения из байтового массива
Массив байтов получается таким образом -
BufferedImage image = new Robot().createScreenCapture(new Rectangle(screenDimension));
byte[] array = ((DataBufferByte)getGraycaleImage(image).getRaster().getDataBuffer()).getData();
// Method getGraycaleImage returns a grayscaled BufferedImage, it works fine
Теперь, как мне восстановить это изображение в градациях серого из массива байтов?
Я не знаю много об ARGB, RGB или градациях серого. Я попробовал это -
private Image getGrayscaleImageFromArray(byte[] pixels, int width, int height)
{
int[] pixels2=getIntArrayFromByteArray(pixels);
MemoryImageSource mis = new MemoryImageSource(width, height, pixels2, 0, width);
Toolkit tk = Toolkit.getDefaultToolkit();
return tk.createImage(mis);
}
private int[] getIntArrayFromByteArray(byte[] pixelsByte)
{
int[] pixelsInt=new int[pixelsByte.length];
int i;
for(i=0;i<pixelsByte.length;i++)
pixelsInt[i]=pixelsByte[i]<<24 | pixelsByte[i]<<16
| pixelsByte[i]<<8 | pixelsByte[i]; // I think this line creates the problem
return pixelsInt;
}
Когда я рисую это изображение, оно не черно-белое, а что-то вроде оранжевого и серого.
3 ответа
Я надеюсь, что это поможет вам, если я объясню вам, как конвертировать из ARGB/RGB 2 grey, потому что слишком много неизвестных функций и классов: P
ARGB 32 бит / пиксель, поэтому 8 бит для каждого канала. альфа-канал является непрозрачным, поэтому противоположность прозрачности, поэтому 0 является прозрачным.
RGB составляет 24 бит / пиксель. Чтобы конвертировать из ARGB в RGB, вы должны закрыть альфа-канал.
Чтобы преобразовать RGB в оттенки серого, вы должны использовать эту формулу:
0.2989 * R + 0.5870 * G + 0.1140 * B
поэтому вы должны выяснить, какой байт принадлежит какому каналу;)
Вы должны указать правильный ColorSpace
соответствующий изображению в оттенках серого.
Вот пример, который можно найти на http://technojeeves.com/joomla/index.php/free/89-create-grayscale-image-on-the-fly-in-java:
public static BufferedImage getGrayscale(int width, byte[] buffer) {
int height = buffer.length / width;
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
int[] nBits = { 8 };
ColorModel cm = new ComponentColorModel(cs, nBits, false, true,
Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
SampleModel sm = cm.createCompatibleSampleModel(width, height);
DataBufferByte db = new DataBufferByte(buffer, width * height);
WritableRaster raster = Raster.createWritableRaster(sm, db, null);
BufferedImage result = new BufferedImage(cm, raster, false, null);
return result;
}
Это будет работать Просто убедитесь, что вы настраиваете тип изображения так, как вам нужно:
Image img = new ImageIcon(array).getImage();
BufferedImage image = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
image.createGraphics().drawImage(img, 0, 0, null);