2017-05-26 8 views
-1

私のアンドロイドアプリケーションを使用してギャラリーから画像を選択し、環境ディレクトリに保存せずに保存しました。元の画像サイズは1.4Mbでしたが、新しい保存画像サイズは4Mbを超えています。 私が使用したコードは以下の通りです。保存した画像がギャラリから選択した画像より大きい

case REQUEST_CODE_FROM_GALLERY: 
      String datastring1=data.getDataString(); 
      Uri uri = data.getData(); 
      Bitmap bitmap = null; 
      try { 
       bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); 
       Log.e("..............",bitmap.getHeight()+","+bitmap.getWidth()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      storeImage(bitmap); 

      break; 

private boolean storeImage(Bitmap image) { 
    File pictureFile = createDir(MEDIA_TYPE_IMAGE); 
    try { 
     FileOutputStream fileOutputStream = new FileOutputStream(pictureFile); 
     image.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream); 
     fileOutputStream.flush(); 
     fileOutputStream.close(); 
     return true; 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     return false; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 

private File createDir(int type) { 
    File file; 
    File filedir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "EffitientImageLoading"); 
    if (!filedir.exists()) { 
     if (!filedir.mkdir()) 
      Toast.makeText(this, "Directory could not be created!! Try Again" 
        , Toast.LENGTH_LONG).show(); 
    } 
    String timestamp = new SimpleDateFormat("ddmmyy_hhmmss").format(new Date()); 
    if (type == MEDIA_TYPE_IMAGE) { 
     file = new File(filedir.getPath() + File.separator + 
       "IMG_" + timestamp + ".png"); 
    } else { 
     return null; 
    } 
    currentphotopath = "file:" + file.getAbsolutePath(); 
    return file; 
} 
+0

「Bitmap.CompressFormat.JPEG、100」を「Bitmap.CompressFormat.JPEG、10」に変更するとどうなりますか?より小さいサイズ、最悪の品質。あなたの場合、比率は1:3(1.4MBから4.2MB)のようです。したがって、 'Bitmap.CompressFormat.JPEG、33'はそのトリックを行うべきです。また、JPEGはLOSSY圧縮を使用しています。したがって、イメージを保存するたびに、品質が悪化し、より悪化します。 –

+0

はい、ただし100は保存された画像の品質が100%、つまり画像のサイズと同じであることを意味します。しかし、ここでは画像のサイズがオリジナルよりも増えています。私が100の代わりに33を置くと、質の低下が起こります。 @Rotwang –

+0

それは**まったく間違っています**。イメージはメモリ内で解凍されます。元の画像ではなく、圧縮解除された画像の100%を保存しています。 –

答えて

0

だけでなく、あなたは、画像の品質を低下させることができます -

image.compress(Bitmap.CompressFormat.JPEG, 60, fileOutputStream); 

この60%の品質であなたのイメージを保存します。

圧縮解除されたイメージを保存すると、スペースが追加されます。

1

実際には.PNGファイル形式を使用して画像を保存しますが、ロスレス形式では画像のサイズを圧縮できません。あなたのコードにいくつかの修正を加えて使用し、イメージのサイズに変化があった場合は元に戻してください。

case REQUEST_CODE_FROM_GALLERY: 
      String datastring1=data.getDataString(); 
      Uri uri = data.getData(); 
      Bitmap bitmap = null; 
      try { 
       bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); 
       Log.e("..............",bitmap.getHeight()+","+bitmap.getWidth()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      storeImage(bitmap); 

      break; 

private boolean storeImage(Bitmap image) { 
    File pictureFile = createDir(MEDIA_TYPE_IMAGE); 
    try { 
     FileOutputStream fileOutputStream = new FileOutputStream(pictureFile); 
     image.compress(Bitmap.CompressFormat.JPEG, 70, fileOutputStream); 
     fileOutputStream.flush(); 
     fileOutputStream.close(); 
     return true; 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     return false; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 

private File createDir(int type) { 
    File file; 
    File filedir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "EffitientImageLoading"); 
    if (!filedir.exists()) { 
     if (!filedir.mkdir()) 
      Toast.makeText(this, "Directory could not be created!! Try Again" 
        , Toast.LENGTH_LONG).show(); 
    } 
    String timestamp = new SimpleDateFormat("ddmmyy_hhmmss").format(new Date()); 
    if (type == MEDIA_TYPE_IMAGE) { 
     file = new File(filedir.getPath() + File.separator + 
       "IMG_" + timestamp + ".JPEG"); 
    } else { 
     return null; 
    } 
    currentphotopath = "file:" + file.getAbsolutePath(); 
    return file; 
} 
+0

これは画像のサイズを約30%に縮小しました。私は100が何を意味するのか知りたい。元のイメージを意味しているのではありません。 –

1

あなたが選んだ画像をコピーしたい場合は、あなたのファイルパスに対して得られたURIとファイル出力ストリームのための入力ストリームを開きます。次に、入力ストリームからループchuncksを読み込み、ファイル出力ストリームに書き込みます。通常のコピー。

InputStream is = getContentResolver().openInputStrea(data.getData()); 

FileOutputStream fos = new FileOutputStrea(path); 
+0

@deepakbajpayちょうどこの答えを読んで、これはあなたが従うべき唯一の方法です – pskink

関連する問題