【问题标题】:Generating random ARGB images doesn't produce images that can be opened生成随机 ARGB 图像不会生成可打开的图像
【发布时间】:2021-04-10 20:56:42
【问题描述】:

我正在尝试生成随机数组并将它们保存为 argb 图像。但是,当我这样做时,当我打开 .png 图像时,图像是空白的,就好像它们的 alpha 值都为 0,而不管我使用什么软件打开它们。到目前为止,这是我的代码:

import java.io.*;
import java.text.*;
import java.util.*;
import javax.imageio.ImageIO;
import java.awt.image.*;

public class RandomColour
{
    public static void main(String[] args) {
        int w = 100;
        int h = 100;
        int arr[] = new int[w*h];
        for (int i = 0; i < arr.length; i++) {
            int r = (int) (Math.random() * 254);
            int g = (int) (Math.random() * 254);
            int b = (int) (Math.random() * 254);
            arr[i] = 0xFF000000 | (r << 16) | (g << 8) | b;
        }
        BufferedImage outputImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        WritableRaster raster = outputImage.getRaster();
        raster.setSamples(0, 0, w, h, 0, arr);
        try {
            ImageIO.write(outputImage, "png", new File("output.png"));
        } catch(Exception e){
            System.out.println(e);
        }
        System.out.println("Finished generating a random image.");

    }
}

【问题讨论】:

    标签: java png


    【解决方案1】:

    代码主要是看起来不错。问题是raster.setSamples(0, 0, w, h, 0, arr) 的使用。注意倒数第二个参数(不言自明,名为b?),它是“band”。这意味着您的代码只为波段 0 设置样本,在这种情况下是 R 或红色分量。

    如果您将这一行更改为:

    raster.setDataElements(0, 0, w, h, arr);
    

    您的代码将按预期工作,并且 PNG 将包含随机的“静态”噪声。无需其他更改。

    PS:这仅适用于您的图像为TYPE_INT_ARGB,因为setDataElements 假定数组的格式与栅格的传输类型相同。

    【讨论】:

    • 谢谢,确实是这个问题!
    猜你喜欢
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2014-07-03
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多