2016-09-22 18 views
1

ギャラリーから画像を取得しようとしています。それは私にビットマップとしてイメージを与えています。イメージを.jpgファイルにして、データベースにファイル名を保存できるようにします。ギャラリーからの画像を.jpgファイル形式で取得する方法は?

私はこのチュートリアルに従った:

http://www.theappguruz.com/blog/android-take-photo-camera-gallery-code-sample

ギャラリ画像選択されたコード:

@SuppressWarnings("deprecation") 
private void onSelectFromGalleryResult(Intent data) { 

    Bitmap bm=null; 
    if (data != null) { 
     try { 
      bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    Uri selectedImage = data.getData(); 

    String[] filePath = {MediaStore.Images.Media.DATA}; 

    Cursor c = getContentResolver().query(selectedImage, filePath, null, null, null); 


    c.moveToFirst(); 

    int columnIndex = c.getColumnIndex(filePath[0]); 

    String picturePath = c.getString(columnIndex); 

    c.close(); 
    File file = new File(picturePath);// error line 

    mProfileImage = file; 

    profile_image.setImageBitmap(bm); 
} 

私はこれを試みました。しかし、私はファイルにnullポインタを取得しています。

例外:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference 

また、私は、この新しく作成されたファイルが外部ストレージに保存する必要はありません。これは一時ファイルである必要があります。これどうやってするの?

ありがとう..

+0

ご確認くださいhttp://stackoverflow.com/questions/5383797/open-an-image-using-uri-in-androids-default-gallery-image-viwer – Shailesh

答えて

1

良いニュースは、あなたが考えるよりもはるかに近いですか?

Bitmap bm=null; 
if (data != null) { 
    try { 
     bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

bm != nullの場合は、Bitmapオブジェクトがあります。 Bitmapは、Androidの一般的なイメージオブジェクトで、すぐに使用できます。実際にはすでに.jpg形式になっているので、ファイルに書き込むだけです。あなたは、一時ファイルにそれを書きたいので、私はこのような何かをしたい:

かかわらず
File outputDir = context.getCacheDir(); // Activity context 
File outputFile = File.createTempFile("prefix", "extension", outputDir); // follow the API for createTempFile 

、この時点では、ファイルへのBitmapを書くために非常に簡単です。

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bm.compress(Bitmap.CompressFormat.JPEG, 100, stream); //replace 100 with desired quality percentage. 
byte[] byteArray = stream.toByteArray(); 

これでバイト配列が作成されました。私はそれをファイルに書いておきます。

あなたが離れて行くために一時ファイルをしたい場合は、詳細はこちらを参照してください。私はそれが役に立てば幸いhttps://developer.android.com/reference/java/io/File.html#deleteOnExit()

Bitmap bm=null; 
if (data != null) { 
    try { 
     bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
if (bm != null) { // sanity check 
    File outputDir = context.getCacheDir(); // Activity context 
    File outputFile = File.createTempFile("image", "jpg", outputDir); // follow the API for createTempFile 

    FileOutputStream stream = new FileOutputStream (outputFile, false); // Add false here so we don't append an image to another image. That would be weird. 
    // This line actually writes a bitmap to the stream. If you use a ByteArrayOutputStream, you end up with a byte array. If you use a FileOutputStream, you end up with a file. 
    bm.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
    stream.close(); // cleanup 
} 

+0

私は一時ファイルを作成するあなたの答えを試みました..しかし、さらに、ファイルを変換中にエラーが発生しています。編集した質問を確認してください。 ? @エリック – Sid

+0

@Sid申し訳ありませんが、私はあなたが私を誤解したと思います。ビットマップを取得したら、それをバイト配列に変換します: 'ByteArrayOutputStream stream = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat。JPEG、100、ストリーム)。 // 100を希望の品質パーセンテージに置き換えます。 byte [] byteArray = stream.toByteArray(); 'バイト配列に変換したら、その配列をファイルに書き込みます。あなたのコードでは、あなたがそうしているようには見えません。 – Eric

0

picturePathがnullのようです。そのため、イメージを変換することはできません。選択した画像のパスを取得するには、このコードの一部を追加してみてください:その後

private String getRealPathFromURI(Uri uri) { 
    String[] projection = { MediaStore.Images.Media.DATA }; 
    @SuppressWarnings("deprecation") 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    int column_index = cursor 
     .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 

を、あなたのonSelectFromGalleryResultを変更する必要があります。行String[] filePath = {MediaStore.Images.Media.DATA};などを削除/無効にし、以下のように置き換えてください。

Uri selectedImageUri = Uri.parse(selectedImage); 
String photoPath = getRealPathFromURI(selectedImageUri); 
mProfileImage = new File(photoPath); 

//check if you get something like this - file:///mnt/sdcard/yourselectedimage.png 
Log.i("FilePath", mProfileImage.getAbsolutePath) 
if(mProfileImage.isExist()){ 
    //Check if the file is exist. 
    //Do something here (display the image using imageView/ convert the image into string) 
} 

質問:それを.jpg形式で変換する必要がある理由は何ですか? .gif、.pngなどにすることはできますか?

関連する問題