2017-12-29 8 views
6

イメージをピクセルの配列に変換しました。 3つの別々の配列にRGB値を保存しました。イメージをピクセルの配列に変換し、ピクセルを使用してイメージを再作成します。サイズは縮小されます。どうして?

次に、同じ値(操作なし)を使用してイメージを作成しようとしました。元の画像は205kBで、新しい画像はB & W画像の場合は121kB、カラー画像の場合は215kB〜96kBです。また、明るさに若干の変化があります(明るさが増し、全体のコントラストも上がります)。これを引き起こしているのは何ですか?

私は色付きとB & W画像を試しました。結果は同じでした。

また、以前の出力イメージ(96kB)で同じコードを実行しましたが、新しい出力はまだ96kBでした。

Codes-


1)画像を読み取る:

int width = img.getWidth(null); 
int height = img.getHeight(null); 

pixelR = new int[width * height]; 
pixelG = new int[width * height]; 
pixelB = new int[width * height]; 

int index=0; 

int r, g, b, gray, rgb; 

for(int i=0; i<width; i++) { 
    for (int j=0; j<height; j++) { 
    rgb = img.getRGB(i, j); 

    r = (rgb >> 16) & 0xFF; 
    g = (rgb >> 8) & 0xFF; 
    b = (rgb & 0xFF); 

    pixelR[index]=r; 
    pixelG[index]=g; 
    pixelB[index]=b; 
    index++; 
    } 
} 

2)イメージを書く

 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

    int index=0; 
    int val; 
    int r, g, b; 

    for (int i=0; i<width; i++) { 
    for (int j=0; j<height; j++) { 

     r=pixelR[index]; 
     g=pixelG[index]; 
     b=pixelB[index++]; 

     Color newColor = new Color((int)r, (int)g, (int)b);  
     image.setRGB(i, j, newColor.getRGB()); 
    } 
    } 

    File f = null; 

    try{ 
    f = new File("<filepath>.jpg"); 
     ImageIO.write(image, "jpg", f); 
    }catch(IOException e){ 
     System.out.println("Error: "+e); 
    } 
    } 
+3

おそらく、元の画像よりも低品質で書いていますか? –

+1

'pixelR [index] = r; pixelG [index] = r; pixelB [index] = r; 'あなたは同じ値を何度も何度も割り当てています。それはタイプミスですか? – TDG

+0

@TDGはい、タイプミス。修正されました。 –

答えて

1

圧縮レベルを異なる値に設定して、ファイルサイズがどのように違うかを調べることができます。その方法については、Setting jpg compression level with ImageIO in Javaを参照してください。

しかし、明るさとコントラストの変化は説明しません。

+0

そのような場合、出力イメージを入力イメージとして提供すると、出力イメージは再び圧縮されませんか?たとえば、画像を言うと、** image1 **は100kBで、プログラムを実行すると60kBに圧縮され、** output1 **として保存されます。プログラムを実行すると60kBの画像が再び圧縮されるはずです** output2 **として保存してください。そうでない場合は** output2 **も60kBです。 –

+0

いいえ、一般的には、複数回、ポジティブエフェクト(サイズ縮小)で圧縮することはできません。そのような場合は、何回も連続して圧縮し、1バイトだけのファイルを作成することができます。結果として得られるファイルは、同様の品質で画像をエンコードすることができません。圧縮は、データ内のパターンを検出し、それらを効率的に符号化することに依存する。多くの一般的なアルゴリズムでは、既に圧縮されたデータに対して2回目の実行時に省スペースパターンは検出されません。 – sebkur

+0

データの圧縮に関する一般的な議論については、https://stackoverflow.com/questions/3198666/why-can-data-be-compressed-only-onceを参照してください。 – sebkur

関連する問題