我试图将图像上任何给定像素的RGB值转换为12位二进制,每个通道由4位表示。例如,如果一个像素的红色通道为“ 255”,或二进制为“ 11111111”。我希望将其转换为“ 1111”。
我的代码可以运行,但是速度很慢,我想知道是否有更好的方法可以做到这一点。
这就是我所做的。
我使用方法getRGB(x,y)来获取一个像素的RGB值。
例如-4278864
我将其转换为3个独立的渠道,例如r 190克181 b 176
我将其除以16得到等于4位的整数
表示
我将数字转换为二进制。
如果生成的二进制数较少,则在二进制数前面加0
比4位
连接到12位二进制文件以表示12位彩色输出。例如101110111011
这是我的代码:
import java.awt.Component;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class LoadImageApp extends Component {
private static int[] rgbArray;
private static double bitPerColor = 4.0;
public static void main(String[] args) {
BufferedImage img = null;
String fileName = "Image.jpg";
try {
//Read in new image file
img = ImageIO.read(new File("src/"+fileName));
}
catch (IOException e){
}
if (img == null) {
System.out.println("No image loaded");
}
else {
//Get RGB Value
int val = img.getRGB(500, 500);
System.out.println("rgbValue from getRGB is: " + val);
//Convert to three separate channels
int a = (0xff000000 & val) >>> 24;
int r = (0x00ff0000 & val) >> 16;
int g = (0x0000ff00 & val) >> 8;
int b = (0x000000ff & val);
System.out.println("rgbValue in RGB is: ");
System.out.println("a " + a + " r " + r + " g " + g + " b " + b);
double power = Math.pow(2.0, bitPerColor);
//Convert each channel to binary
String r4bit = Integer.toBinaryString((int)(r/(power)));
String g4bit = Integer.toBinaryString((int)(g/(power)));
String b4bit = Integer.toBinaryString((int)(b/(power)));
//Convert concatonate 0's in front to get desired bit count
int rDifference = (int)bitPerColor - r4bit.length();
int gDifference = (int)bitPerColor - g4bit.length();
int bDifference = (int)bitPerColor - b4bit.length();
for (int i = rDifference; i > 0; i--){
r4bit="0"+r4bit;}
for (int i = gDifference; i > 0; i--){
g4bit = "0"+g4bit;}
for (int i = bDifference; i > 0; i--){
b4bit = "0"+b4bit;}
//Concatonate three channel together to form one binary
String rgbValue = r4bit + g4bit + b4bit;
System.out.println("rgbValue in binary is: " + rgbValue);
}
}
}
一切都按要求正常工作。但是,读取一个像素真的很丑,而且很慢,需要2-3秒。我希望使用该代码一次读取图像的一部分,但是我可以使用AGES对其进行成像。
因此,任何帮助将不胜感激。
提前致谢。
最佳答案
您的原始代码(十六进制)为0x00rrggbb
。您要将其转换为0x00000rgb
。可以做到这一点:
int rgb24 = ....;
int rgb12 = (rgb24 & 0x00f00000) >> 12 +
(rgb24 & 0x0000f000) >> 8 +
(rgb24 & 0x000000f0) >> 4;
如果您想“舍入”到最接近的颜色而不是截断,可以这样做:
int r = (rgb24 & 0x00ff0000);
int g = (rgb24 & 0x0000ff00);
int b = (rgb24 & 0x000000ff);
r += (r >= 0x00f00000) ? 0x00080000 : 0;
g += (g >= 0x0000f000) ? 0x00000800 : 0;
b += (b >= 0x000000f0) ? 0x00000008 : 0;
int rgb12 = (r & 0x00f00000) >> 12 + (g & 0x0000f000) >> 8 + (b & 0x000000f0) >> 4;
仅在高阶4位尚未为1111时(会冒溢出的危险),此取整。