2017-02-05 3 views
1

主に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; 
} 

私のスクリプトの(たぶん)関連部分。

+0

を参照してください?それが最初のものなら、イメージの例が役に立ちます。 – Itai

+0

あなたは達成したいことをあまりうまく説明していません。あなたはすべてを単一の色にしたいと言っていますが、色をまったく変換しません(たとえば、グレースケールなど)。 – john16384

+0

また、 'Tools.rgbaToInt'の出力が正しいのですか?たぶんあなたもそれを投稿する必要があります(私はこれがあなたが書いた方法であると仮定しています)。 – Itai

答えて

0

私はあなたが達成したいものに近いと思います。しかし、元の色を維持する代わりに、R、G、Bを(255,255,255)と計算されたアルファに設定するだけです。

+0

それは私が達成したいものではありません。あなたのケースでは、画像が灰色の背景に表示された場合、非透明部分は灰色の代わりに白く見えます。 – Torn

0

おそらく、色の明るさを適切に考慮していないため、出力が見えているようです。アルファのRGB値を平均しても良い結果は得られません。一般的に次のような式を使用します。

0.299*R + 0.587*G + 0.114*B 

あなたは、彼らが必要、または生の値が間違っていると思うと、彼らが表示されない意味Formula to determine brightness of RGB color

+0

出力が奇妙に見えず、実際にはほぼ同じように見えます。これは視覚的な問題ではなく、ピクチャのすべてのピクセルを同じRGB値に設定しますが、保存後にイメージを開くと、色は同じではありません。 – Torn

関連する問題