使用 PixelWriter.setargb
Using PixelWriter.setargb
我有一个关于使用灰度图像数据的字节数组创建 JavaFX WritableImage 的问题。
我确实为 BufferedImage 编写了一个工作函数,但在我看来是 Image 的等效方法 return 我得到了一个所有条目都等于 0 的图像。
这是工作方法:
private static BufferedImage getBufferedImageFromData(int height, int width, byte[] data) {
BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for(int i = 0; i < width * height; ++i){
int a = 0xFF << 24;
int r = (data[i] & 0xFF) << 16;
int g = (data[i] & 0xFF) << 8;
int b = data[i] & 0xFF;
int x = i % width;
int y = (i - x)/width;
result.setRGB(x, y, a | r | g | b);
}
return result;
}
这是我对 JavaFX 的等效方法的尝试(其中 return 是一个所有像素都设置为 0 的图像):
private static Image getImageFromData(int height, int width, byte[] data) {
WritableImage wr = new WritableImage(width, height);
PixelWriter pw = wr.getPixelWriter();
for(int i = 0; i < width * height; ++i) {
int r = (data[i] & 0xFF) << 16;
int g = (data[i] & 0xFF) << 8;
int b = data[i] & 0xFF;
int x = i % width;
int y = (i - x)/width;
pw.setArgb(x, y, r | g | b);
}
return wr;
}
现在,到目前为止我能想到为什么我得到一个充满 0 的图像的唯一原因是我没有正确格式化我的值,也就是说 BufferedImage.setRGB 确实格式化给定的值和 PixelWriter.argb 期望被赋予格式化的值。
我不知道我需要更改什么才能让它工作
至于为什么不用PixelWriter.setPixels:
与我尝试的方法相比,它似乎非常耗时,因为它确实需要我设置一个比当前大 3 倍的新数组,然后才将其交给该方法。
反正我试过了,没成功。
感谢您的帮助
您忘记了 argb
的 a
部分。这意味着你写一个带有 0
的像素作为 alpha 通道。这意味着您的所有像素都是完全透明的。您需要将 alpha 通道设置为 100%
以创建完全不透明的图像:
private static Image getImageFromData(int height, int width, byte[] data) {
WritableImage wr = new WritableImage(width, height);
PixelWriter pw = wr.getPixelWriter();
for (int i = 0; i < width * height; ++i) {
int value = data[i] & 0xFF;
int r = value << 16;
int g = value << 8;
int b = value;
int x = i % width;
int y = i / width;
// include alpha here
pw.setArgb(x, y, (0xFF<<24) | r | g | b);
}
return wr;
}
请注意,我已将 (i - x)/width
简化为 i / width
,因为整数除法被截断了。
我有一个关于使用灰度图像数据的字节数组创建 JavaFX WritableImage 的问题。
我确实为 BufferedImage 编写了一个工作函数,但在我看来是 Image 的等效方法 return 我得到了一个所有条目都等于 0 的图像。
这是工作方法:
private static BufferedImage getBufferedImageFromData(int height, int width, byte[] data) {
BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for(int i = 0; i < width * height; ++i){
int a = 0xFF << 24;
int r = (data[i] & 0xFF) << 16;
int g = (data[i] & 0xFF) << 8;
int b = data[i] & 0xFF;
int x = i % width;
int y = (i - x)/width;
result.setRGB(x, y, a | r | g | b);
}
return result;
}
这是我对 JavaFX 的等效方法的尝试(其中 return 是一个所有像素都设置为 0 的图像):
private static Image getImageFromData(int height, int width, byte[] data) {
WritableImage wr = new WritableImage(width, height);
PixelWriter pw = wr.getPixelWriter();
for(int i = 0; i < width * height; ++i) {
int r = (data[i] & 0xFF) << 16;
int g = (data[i] & 0xFF) << 8;
int b = data[i] & 0xFF;
int x = i % width;
int y = (i - x)/width;
pw.setArgb(x, y, r | g | b);
}
return wr;
}
现在,到目前为止我能想到为什么我得到一个充满 0 的图像的唯一原因是我没有正确格式化我的值,也就是说 BufferedImage.setRGB 确实格式化给定的值和 PixelWriter.argb 期望被赋予格式化的值。
我不知道我需要更改什么才能让它工作
至于为什么不用PixelWriter.setPixels: 与我尝试的方法相比,它似乎非常耗时,因为它确实需要我设置一个比当前大 3 倍的新数组,然后才将其交给该方法。 反正我试过了,没成功。
感谢您的帮助
您忘记了 argb
的 a
部分。这意味着你写一个带有 0
的像素作为 alpha 通道。这意味着您的所有像素都是完全透明的。您需要将 alpha 通道设置为 100%
以创建完全不透明的图像:
private static Image getImageFromData(int height, int width, byte[] data) {
WritableImage wr = new WritableImage(width, height);
PixelWriter pw = wr.getPixelWriter();
for (int i = 0; i < width * height; ++i) {
int value = data[i] & 0xFF;
int r = value << 16;
int g = value << 8;
int b = value;
int x = i % width;
int y = i / width;
// include alpha here
pw.setArgb(x, y, (0xFF<<24) | r | g | b);
}
return wr;
}
请注意,我已将 (i - x)/width
简化为 i / width
,因为整数除法被截断了。