主にJavaFXを使用して、私は既存の画像を取り込み、それをすべて単一の色になるように変換しようとしていますが、より暗い色はより不透明で明るい色がより透明になります。
単純に、各ピクセルについて、R、G、Bの値を加算し、3で除算し、255から減算し、それをアルファとして設定します。私の場合、それらは54,57,62です。
問題がどこで発生するのかはっきりとは分かりませんが、出力を見ると、不透明(暗い)の色は正しいです。アルファ滴が低いほど、色が少ないと思われます。なぜJavaはアルファ値の低いピクセルの色を間違って保存するのですか?
Examples:
54, 58, 63 for Alpha = 57
52, 60, 60 for Alpha = 34
36, 73, 73 for Alpha = 7
WritableImage out = new WritableImage(width, height);
PixelWriter setPixel = out.getPixelWriter();
PixelFormat<IntBuffer> pixelFormat = PixelFormat.getIntArgbInstance();
PixelReader getPixel = in.getPixelReader();
int[][] imageData = new int[height][width];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
imageData[y][x] = getPixel.getArgb(x, y);
}
}
int[][][] inRgba = Tools.intToRgba(imageData, width, height);
System.out.println("Enter the R, G, B components of the output, in order.");
int outR = input.nextInt();
int outG = input.nextInt();
int outB = input.nextInt();
input.nextLine(); //To clear the newline.
int[][][] outRgba = new int[height][width][4];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
outRgba[y][x] = new int[] {outR, outG, outB, 255 - (int) Math.round((inRgba[y][x][0] + inRgba[y][x][1] + inRgba[y][x][2])/3.0)};
}
int[] outputBuffer = Tools.rgbaToInt(outRgba, width, height);
setPixel.setPixels(0, 0, width, height, pixelFormat, outputBuffer, 0, width);
File file = Files.createFile(Paths.get(path2)).toFile();
ImageIO.write(SwingFXUtils.fromFXImage(out, null), "png", file);
public static int[] rgbaToInt(int[][][] image, int width, int height) {
int[] intBuffer = new int[height * width];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
intBuffer[y * width + x] = (image[y][x][3] << 24) | (image[y][x][0] << 16) | (image[y][x][1] << 8) | image[y][x][2];
}
}
return intBuffer;
}
私のスクリプトの(たぶん)関連部分。
を参照してください?それが最初のものなら、イメージの例が役に立ちます。 – Itai
あなたは達成したいことをあまりうまく説明していません。あなたはすべてを単一の色にしたいと言っていますが、色をまったく変換しません(たとえば、グレースケールなど)。 – john16384
また、 'Tools.rgbaToInt'の出力が正しいのですか?たぶんあなたもそれを投稿する必要があります(私はこれがあなたが書いた方法であると仮定しています)。 – Itai