【问题标题】:Create a WritableRaster based on int array基于 int 数组创建 WritableRaster
【发布时间】:2016-05-26 15:51:57
【问题描述】:

我需要获取一个 int 数组并将其转换为 BufferImage。我真的没有关于这个主题的任何背景,我都是从互联网上学到的,所以这就是我想要做的: 从 BufferedImage(done) 创建一个数组,将此数组转换为 IntBuffer(done) - (稍后我需要通过 IntBuffer 对图像进行一些操作),将 IntBuffer 中的更改值放入新数组中(完成),并将这个数组变成 WritableRaster。 (如果我对流程的理解有问题,请告诉我)

这是我处理 WritableRaster 的那一行:

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

Eclipse 将此标记为错误并显示“类型不匹配:无法从 void 转换为 WritableRaster”

请帮忙!我有点迷茫。

也很抱歉英语不好。

编辑: 矩阵:

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

我尝试将值插入栅格的代码部分:

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

错误信息:

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

【问题讨论】:

  • 检查你的语法,都错了。
  • 所有过程还是我如何创建栅格?
  • 为什么你认为setPixels() 会返回WritableRaster?它没有。
  • 那么我究竟需要如何创建一个 WritableRaster?以及如何在后面设置 int 值?如果您能尽快向我解释一下,那就太好了。

标签: java image-processing raster


【解决方案1】:

您可以像这样从int 数组创建WritableRaster 和/或BufferedImage

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

【讨论】:

  • 他需要一个二值图像。
  • OPs 示例明确使用 RGB,从未提及二进制。你怎么知道他想要二进制?
  • 他在cmets里说的
  • 没错。在问题被编辑以反映此要求之前,这是一个完全可以接受的答案。
【解决方案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();

【讨论】:

  • 2400 因为 4*height*width
【解决方案3】:

setPixels 返回 void:

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

所以您需要创建 Raster 并为其设置像素:

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

您需要为每个像素放置 4 个 int(这取决于颜色模型,ARGB 为 4 个)。所以,矩阵大小必须是

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

在此处查看有关 WritableRaster 的更多信息 —

Oracle: WritableRaster

Code examples

【讨论】:

  • 首先感谢您的帮助!这是我尝试按照您所说的进行操作的行,您能告诉我这里有什么问题吗? IntBuffer 数据= IntBuffer.wrap(matrix);数据.put(0,69);数据.rewind();点坐标=new Point(0,0); SampleModel 样本=img.getSampleModel(); WritableRaster newRaster= WritableRaster.createWritableRaster(样本, 坐标); newRaster.setPixels(0, 0, 宽度, 高度, 矩阵);它说数组超出范围,我认为它与 SampleModel 有关,但我不知道如何通过放置任何值来创建它。谢谢你
  • img 有哪些类型?你在哪里得到宽度和高度?
  • 另外,在这里查看第一个答案:stackoverflow.com/questions/9094620/…
  • 我会查看链接...为您提出问题 - img 是一个 BufferedImage,我使用 img.getHeight/width(); 方法获得的宽度和高度;矩阵大小为高*宽
  • 我按照他们的建议做了,这行也有同样的问题:newRaster.setPixels(0, 0, width, height, matrix); ''线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常''我只是不明白问题出在哪里
猜你喜欢
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多