2012-08-28 6 views
2

Массива байт, полученные таким образом -Создания 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 серых причины слишком много неизвестных функций и классы: P

ARGB 32 бит/пиксель, поэтому 8 бит для каждого канала. альфа-канал - это непрозрачность, так что прозрачность прозрачна.

RGB - 24 бит/пиксель. для преобразования из ARGB в RGB вам нужно отклонить альфа-канал.

для преобразования из RGB в оттенки серого и есть использовать эту формулу:

0.2989 * R + 0.5870 * G + 0.1140 * B 

так что вы должны выяснить, какой байт принадлежит к какому каналу;)

+0

Это, вероятно, то, о чем я точно спрашивал. Благодаря! –

6

Вы должны указать правит 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; 
} 
+0

Спасибо, это работает отлично! –

1

Это будет работать. Просто убедитесь, что вы настраиваете изображение типа, как вам нужно:

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);