我不明白Java的WritableRaster类是如何工作的。我尝试查看文档,但不理解它是如何从像素数组中获取值的。另外,我不确定像素数组是什么。
我在这里解释一下。
我想做的是:Shamir的秘密分享图像。为此,我需要在BuferedImage图像中获取图像。我拍了一张秘密照片。通过在图像的每个像素上运行“功能”来创建共享。 (基本上用某些东西改变像素值)
段:
int w = image.getWidth();
int h = image.getHeight();
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
int pixel = image.getRGB(j, i);
int red = (pixel >> 16) & 0xFF;
int green = (pixel >> 8) & 0xFF;
int blue = (pixel) & 0xFF;
pixels[j][i] = share1(red, green, blue);
//现在取这些rgb值。我使用某个函数更改它们并返回一个int值。像这样:
public int share1 (r, g, b)
{
a1 = rand.nextInt(primeNumber);
total1 = r+g+b+a1;
new_pixel = total1 % primeNumber;
return new_pixel;
}
//这个2d数组像素具有所有新的颜色值,对吧?但现在我想用这个新值构建一个图像。所以我做的是。 首先将此像素数组转换为列表。 现在,此列表具有新图像的像素值。但是要使用RasterObj.setPixels()方法构建图像,我需要一个具有RGB值的数组[我可能会错在这里!] 因此,我获取列表的各个值并找到rgb值并将其连续放入新的1D数组中 pixelvector..something like this(r1,g1,b1,r2,g2,b2,r3,g3,b3 ...)
列表的大小为w h,因为它包含每个像素的单个像素值。 但是,新数组像素向量的大小将变为w h * 3,因为它包含每个像素的r,g,b值。
然后形成图像我这样做:Snippet
BufferedImage image_share1 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
WritableRaster rast = (WritableRaster) image_share1.getData();
rast.setPixels(0, 0, w, h, pixelvector);
image_share1.setData(rast);
ImageIO.write(image_share1,"JPG",new File("share1.jpg"));
如果我在setPixels()方法中放置一个只有单个像素值的数组,它就不会从该函数返回!但是如果我将一个数组放入单独的r,g,b值,它将从函数返回。但是为share1做同样的事情,分享2等等。我只得到了蓝色的阴影。所以,我甚至不确定我能否重建图像..
PS - 这可能看起来像我知道的非常愚蠢的代码。但我只有一天的时间来做这个并学习Java中的图像。所以我尽我所能。
谢谢..
答案 0 :(得分:3)
Raster
(如WriteableRaster
及其子类)由SampleModel
和DataBuffer
组成。 SampleModel
描述了样本布局(是像素打包,像素交错,带交错?有多少个带?等等)和维度,而DataBuffer
描述实际存储(是样本字节) ,短,整数,有符号或无符号?每个频段的单个数组或数组?等等......)。
对于BufferedImage.TYPE_INT_RGB
,样本将进行像素打包(对于每个像素,所有3个R,G和B样本都打包到单个int
中),数据/传输类型DataBuffer.TYPE_INT
。< / p>
很抱歉没有直接回答您关于WritableRaster.setPixels(...)
的问题,但我认为这不是您正在寻找的方法(在大多数情况下,并非如此)。 : - )
为了你的目标,我认为你应该做的是:
// Pixels in TYPE_INT_RGB format
// (ie. 0xFFrrggbb, where rr is two bytes red, gg two bytes green etc)
int[] pixelvector = new int[w * h];
BufferedImage image_share1 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
WritableRaster rast = image_share1.getRaster(); // Faster! No copy, and live updated
rast.setDataElements(0, 0, w, h, pixelvector);
// No need to call setData, as we modified image_share1 via it's raster
ImageIO.write(image_share1,"JPG",new File("share1.jpg"));
我假设您的其余代码用于修改每个像素值是正确的。 : - )
但只是一个提示:如果您使用1D数组而不是2D数组,您将使自己更容易(并且由于转换更少而更快)。即:
int[] pixels = new int[w * h]; // instead of int[][] pixels = new int[w][h];
// ...
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
// ...
pixels[y * w + x] = share1(red, green, blue); // instead of pixels[x][y];
}
}