2011-12-19 11 views
2

私の質問が少し変わった。ビットマップが正しく保存されない(Androidのキャンバスから)

EDIT:

// make textures from text 
public static void createTextureFromText(GL10 gl, String text, String texName) { 

    Paint p = new Paint(); 
    p.setColor(Color.GREEN); 
    p.setTextSize(32 * getResources().getDisplayMetrics().density); 

    // get width and height the text takes (in px) 
    int width = (int) p.measureText(text); 
    int height = (int) p.descent(); 

    // Create an empty, mutable bitmap based on textsize 
    Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444); 
    // get a canvas to paint over the bitmap 
    Canvas canvas = new Canvas(bmp); 
    bmp.eraseColor(Color.CYAN); //Cyan for debugging purposes 

    //draw the text 
    canvas.drawText(text, 0, 0, p); 


    // save image - for debugging purposes 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    bmp.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 

    // create a new file name "test.jpg" in sdcard 
    File f = new File(Environment.getExternalStorageDirectory() + File.separator + "test.jpg"); 
    try { 
     f.createNewFile(); 
     // write the bytes in file 
     FileOutputStream fo = new FileOutputStream(f); 
     fo.write(bytes.toByteArray()); 
     fo.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

     .... make texture 

} 

私は今(これは単なる一部である)与えられたテキストからテクスチャを作成するための使用でこのコードを持っています。 しかし、私はビットマップ作成のどこかに欠陥があることを発見しました。私は今、sdカードにBitmapを保存して、どのようにしてすべてのシアンビットマップ(672B、164x7が寸法です)が得られるかを確認します。

誰もがテキスト付きのビットマップを作成しない理由を知りますか?私は何が間違っていますか?あなたが私を助けることができれば:)

+0

私はそれが良い解決策であるかどうか分かりませんが、テキストで(画面上に表示せずに)TextViewを作成すると、そのビューを測定し、それらの次元でビットマップを作成し、ビットマップ(textview.draw(canvas))で作成されたキャンバス。あなたは、テキストにちょうど合うビットマップで終わるでしょう。私はそれがいかに効果的かについては分かりません。 – Jave

+0

あなたが持っているフォントサイズ/スペーシングに合わせてtextviewが適応するので、うまくいきます。 – Jave

+0

http://developer.android.com/reference/android/graphics/Bitmap.html#eraseColor(int) - > "ビットマップのピクセルを指定した色で塗りつぶします。" – ethrbunny

答えて

1

まずあなたがヒーローになるだろう

、あなたのテキストの高さの計算が間違っています。 '降下'の測定値は、ベースラインの下のテキストの部分(つまり、 'g'や 'q'の末尾など)にすぎません。上昇がマイナスであるため、正確な高さは、あなたがしたいことを除いて、アセント+ディセント、次のとおりです。

int height = (int) (p.descent() + -p.ascent()); 

第二に、ときのDrawText()yは、それが上部または下部ではありません、あなたはベースラインがどこに行くそれは与える座標エッジ。テキストを保持するのに十分な大きさのビットマップを塗りたい場合は、y座標も-p.ascent()でなければなりません。

+0

恐ろしい!これは私を1週間以上拘束し、あなたは私のためにそれを解決することができました:Dどうやら私はちょうどメソッドの適切な意味を知る必要がありました。ありがとう! – user717572

関連する問題