Create a WritableRaster based on int array

醉酒当歌 提交于 2019-12-07 14:09:00

问题


I need to take an int array and turn it into BufferImage. I really don't have any background on this subject and I learn it all from the internet so here's what I'm trying to do: Create an array from BufferedImage(done), turn this array into IntBuffer(done) - (Later i'll need to do some opertions on the image through the IntBuffer), put the changed values from the IntBuffer in new array(done), and turn this array into WritableRaster. (If something isn't right in my understading of the process please tell me)

Here's the line where I deal with the WritableRaster:

WritableRaster newRaster= newRaster.setPixels(0, 0, width, height, matrix);

Eclipse marks this as a mistake and says ''Type mismatch:Cannot convert from void to WritableRaster"

Please help! I'm a bit lost.

Also sorry for bad english.

EDIT: The matrix:

         int height=img.getHeight();
         int width=img.getWidth();
         int[]matrix=new int[width*height];

The part of the code where I try to insert values to the Raster:

    BufferedImage finalImg = new BufferedImage(width,height, BufferedImage.TYPE_INT_RGB);
    WritableRaster newRaster= (WritableRaster)finalImg.getData();
    newRaster.setPixels(0, 0, width, height, matrix);

The error message:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10769
at java.awt.image.SinglePixelPackedSampleModel.setPixels(Unknown Source)
at java.awt.image.WritableRaster.setPixels(Unknown Source)

回答1:


You can create a WritableRaster and/or BufferedImage from an int array like this:

int w = 300;
int h = 200;
int[] matrix = new int[w * h];

// ...manipulate the matrix...

DataBufferInt buffer = new DataBufferInt(matrix, matrix.length);

int[] bandMasks = {0xFF0000, 0xFF00, 0xFF, 0xFF000000}; // ARGB (yes, ARGB, as the masks are R, G, B, A always) order
WritableRaster raster = Raster.createPackedRaster(buffer, w, h, w, bandMasks, null);

System.out.println("raster: " + raster);

ColorModel cm = ColorModel.getRGBdefault();
BufferedImage image = new BufferedImage(cm, raster, cm.isAlphaPremultiplied(), null);

System.err.println("image: " + image);



回答2:


    ColorModel cm = ColorModel.getRGBdefault();
    int w = 300;
    int h = 200;
    WritableRaster raster = cm.createCompatibleWritableRaster(w, h);
    DataBufferInt buffer = (DataBufferInt) raster.getDataBuffer();
    int[] bufferData = buffer.getData();
    int[] array = new int[2400];
    Random random = new Random();
    for (int i = 0; i < 2400; i++) {
        array[i] = random.nextInt(2);
    }
    System.arraycopy(array, 0, bufferData, 0, (array.length < bufferData.length ? array.length : bufferData.length));
    BufferedImage image = new BufferedImage(cm, raster, false, null);
    FileOutputStream fos = new FileOutputStream("D:\\abc\\OCR\\" + "LearningRaster" + ".png");
    ImageIO.write(image, "PNG", fos);
    fos.close();



回答3:


setPixels returns void:

public static void setPixels(BufferedImage img,
                         int x, int y, int w, int h, int[] pixels)

so you need to create Raster and than set pixels to it:

WritableRaster newRaster= WritableRaster.createWritableRaster(…);
newRaster.setPixels(0, 0, width, height, matrix);

You need to put 4 int per pixel (it depends on color model, 4 for ARGB). So, matrix size must be

int[] matrix = new int[width * height * 4]

See more about WritableRaster here —

Oracle: WritableRaster

Code examples



来源:https://stackoverflow.com/questions/25178810/create-a-writableraster-based-on-int-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!