0

さて、Androidアプリケーションを作成することになっていますが、何らかの理由で、画像をビットマップ画像に変換できません。これは.png画像であり、コードで変換しようとすると、アプリケーションがクラッシュするだけで、エラーコードが表示されないか、何も表示されません。何度も修正を試みましたが、プログラミングが苦手で、助けが必要です。うまくいきません。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                if (requestCode == FOTO_NEMEN && resultCode == RESULT_OK)
                {
                    final File file = temp;
                    try {
                        String urienzo = "file:///sdcard/DCIM/2013-01-30_13-27-28.png";
                        Uri uri = Uri.parse(urienzo);
                        Bitmap foto = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
                        if (foto == null) {
                            Toast.makeText(this, Uri.fromFile(file).toString(), Toast.LENGTH_SHORT).show();
                            return;
                        }
                        ByteArrayOutputStream bos = new ByteArrayOutputStream();
                        foto.compress(Bitmap.CompressFormat.PNG, 0 , bos);
                        final byte[] bytes = bos.toByteArray();
                        bos.close();
                        AsyncTask<Void,Void,Void> taak = new AsyncTask<Void,Void,Void>() {
                            @Override
                            protected Void doInBackground(Void... params) {
                                stuurAfbeelding(bytes);
                                return null;
                            }   
                        };
                        taak.execute(null,null);
                    } catch (IOException e) {
                        Log.e("Snapper","Fout bij foto nemen: " + e);
                    }
                }
            }

ビットマップ写真の部分に到達するたびに、エラーメッセージなしでアプリケーションがクラッシュします。私のURIがハードコーディングされている理由は、URI.fromfileが間違ったURIを教えてくれたと思うので、確認したかったのです。今ではクラッシュするだけで、コードのどこが悪いのかわかりません。誰かが私を助けてくれませんか?

4

3 に答える 3

1

私の意見では、outOfMemmoryErrorが発生します。

uriからビットマップを取得するには、次のようなものを使用する必要があります。

public static Bitmap getThumbnail(Uri uri) throws FileNotFoundException, IOException{
    InputStream input = this.getContentResolver().openInputStream(uri);

    BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();
    onlyBoundsOptions.inJustDecodeBounds = true;
    onlyBoundsOptions.inDither=true;//optional
    onlyBoundsOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//optional
    BitmapFactory.decodeStream(input, null, onlyBoundsOptions);
    input.close();
    if ((onlyBoundsOptions.outWidth == -1) || (onlyBoundsOptions.outHeight == -1))
        return null;

    int originalSize = (onlyBoundsOptions.outHeight > onlyBoundsOptions.outWidth) ? onlyBoundsOptions.outHeight : onlyBoundsOptions.outWidth;

    double ratio = (originalSize > THUMBNAIL_SIZE) ? (originalSize / THUMBNAIL_SIZE) : 1.0;

    BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
    bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio);
    bitmapOptions.inDither=true;//optional
    bitmapOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//optional
    input = this.getContentResolver().openInputStream(uri);
    Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);
    input.close();
    return bitmap;
}

private static int getPowerOfTwoForSampleRatio(double ratio){
    int k = Integer.highestOneBit((int)Math.floor(ratio));
    if(k==0) return 1;
    else return k;
}

THUMBNAIL_SIZE取得したいYouTubeのサムネイルのサイズはどこですか。だから、それはうまく機能し、私は私のアプリケーションでこのコードを使用します0

link URIからビットマップを取得する方法は?

于 2013-02-16T14:49:25.197 に答える
0

あなたはこのようなものをすることができます:

Bitmap image;
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.PNG, 100, stream);

そして意図からそれを得るためにあなたはこのような何かを試すことができます:

bitmap = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), intent.getData());
String path = getRealPathFromURI(context, intent.getData());
bitmap = scaleImage(imageView, path);

どこ

private String getRealPathFromURI(Context context, Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
CursorLoader loader = new CursorLoader(context, contentUri, proj, null, null, null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
于 2013-02-16T14:51:42.827 に答える
0

ファイルから画像をロードする方法ではないため、クラッシュしていると思います。

コードはあなたが試しているものよりもはるかに単純です:

Bitmap bmp = BitmapFactory.decodeFile(urienzo);

そしてそれがすべてです!私には正しく見えないので、このパスが正しいことを確認してください。

また、大きな画像(4MPなど)をロードしている場合、メモリ不足でクラッシュします。これは、ビットマップのアイデアは、現在HDからFullHDの解像度に近いものを画面に表示するために使用するためです。

于 2013-02-16T15:34:23.920 に答える