画像上の任意のピクセルの RGB 値を 12 ビット バイナリに取得しようとしています。各チャネルは 4 ビットで表されます。たとえば、ピクセルの赤チャンネルが「255」またはバイナリ「11111111」の場合。それを「1111」に変換したいと思います。
コードは動作していますが、かなり遅いので、これを行うためのより良い方法があるかどうか疑問に思っています。
これが私がしたことです。
- メソッド getRGB(x, y) を使用して、1 つのピクセルの RGB 値を取得します。例: -4278864
- それを 3 つの別々のチャネルに変換します。たとえば、r 190 g 181 b 176
- それを 16 で割り、4 ビット表現に相当する整数を取得します。
- 数値を 2 進数に変換します。
- 生成されたバイナリが 4 ビット未満の場合は、バイナリの前に 0 を追加します。
- 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);
}
}
}
必要に応じてすべて正常に動作します。ただし、1ピクセルを読み取るだけで、本当に醜く、遅く、2〜3秒かかります。コードを使用して一度に画像の一部を読み取ることを望んでいましたが、AGES を使用して画像化できます。
そのため、どんな助けでも大歓迎です。
前もって感謝します。