1

私の目的は、リソース イメージの上に描画することです。

したがって、リソースからイメージをロードします。

bm = BitmapFactory.decodeResource(getResources(), R.drawable.image).copy(Bitmap.Config.ARGB_8888, true);

メモリの問題を引き起こす可能性があるため、これが最善の方法ではないことはわかっていますが、今は問題ではありません...次に、キャンバスを作成してその上に描画します

Canvas canv = new Canvas(bm);
canv.drawLine(0, 10, 50, 70, paint);

次に、ビットマップをファイルにエクスポートします。

さて、問題は次のとおりです。

  • 線を描くために使用する座標は、元の画像のピクセルではありません
  • アプリを異なるデバイスで異なる画面で実行すると、結果の画像が異なります (線の位置とサイズが異なります)。

元の画像のピクセルに対する座標を指定する方法、または異なるデバイスで同じ画像結果を取得する方法はありますか?

ありがとう!

4

2 に答える 2

1

あなたが直面した動作は、Android Density の概念によるものです。これは、R.drawable.id からビットマップを作成すると、デバイスの密度に従って画像がスケーリングされることを意味します。その仕組みはほぼ次のとおりです。

  1. デバイス密度を確認し、この ID に最適なドローアブルを選択します: drawable-hdpi/mdpi/.../default から。その結果、イメージを別のフォルダー (hdpi、mdpi など) に配置すると、デバイスごとにサイズが異なります。
  2. 適切なドローアブルがない場合 (たとえば、/drawable/ フォルダーに 1 つだけ提供し、/drawable-hpi(etc)/ には何も提供しなかった場合) - このデフォルトのドローアブルを使用しますが、デバイス密度に基づいてスケーリングしますおよび「デフォルト密度」。

ここで詳細を確認できます: http://developer.android.com/guide/practices/screens_support.html

ただし、すべてのデバイスで同じビットマップ解像度が必要な場合は、次の 2 つの方法をお勧めします。

1) 画像を drawable/ フォルダーではなく、/ drawable-nodpiフォルダーに配置します。スケーリングを防ぎ、Android がデバイス密度に合わせて調整することを拒否します。

2)このアプローチを試すことができます:

InputStream is = getResources().openRawResource(imageId);
originalBitmap = BitmapFactory.decodeStream(is); 

そのようにして、Android 密度スケーリング システムを回避し、/drawable/ フォルダー内のリソースのサイズと正確に一致するビットマップを取得できます。

さらに詳細が必要な場合はお知らせください。幸運を

于 2012-09-02T12:26:08.330 に答える
0

res/drawableこれは、ビットマップをフォルダに入れていることが原因である可能性があります。アプリを実行するデバイスに応じて、ビットマップの解像度が変わるため、線が希望どおりに描画されません。

これを修正するには、ビットマップをアセットフォルダーに配置し、次のようにロードします。

public Bitmap readBitmapFromMemory(String filename) {
        Bitmap defautBitmap = null;
        File filePath = this.getFileStreamPath(filename);
        FileInputStream fi;
        try {
            fi = new FileInputStream(filePath);
            defautBitmap = BitmapFactory.decodeStream(fi);

        } 
        catch (FileNotFoundException e) {
            e.printStackTrace();

        }

        return defautBitmap;

    }

これがお役に立てば幸いです。

于 2012-09-02T12:48:01.093 に答える