1

回転したテキストをキャンバスに描画し、SD カードに JPEG として保存しています。私が直面している問題は、キャンバスのプレビューは問題ないように見えますが、保存された画像の回転したテキストが正しく表示されないことです。デフォルトの Android フォントを使用すると、最終的な JPEG はキャンバス プレビューと同じになりますが、このコードはカスタム書体では機能しません。

最終的に保存された画像とキャンバス プレビューのスクリーンショットの両方をアップロードしました

キャンバス描画にカスタム ビュー クラスを使用しています。これが私のコードです。

public class MyBringBack extends View {


    Bitmap bitmap;
    Typeface type;

public MyBringBack(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        type = Typeface.createFromAsset(context.getAssets(),"fonts/rockwell-bold.ttf"); 
         setDrawingCacheEnabled(true);
    }


@Override
protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);



    Paint paint = new Paint();
        paint.setColor(Color.BLUE);
       // paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
        paint.setTextSize(23);
    Paint paint1 = new Paint();
        paint1.setTextSize(40);
        paint1.setColor(Color.RED);

        canvas.rotate(90,434,110);
        canvas.drawText("Demo Text Demo Text Demo Text  ", 434, 110, paint);
        canvas.restore();
        canvas.save();
        paint1.setTypeface(type);
        canvas.rotate(90,130,185);
        canvas.drawText("Text using Typeface ", 130, 185, paint1);
        canvas.restore();
        canvas.save();
        canvas.rotate(90,180,185);
        canvas.drawText("Text using Typeface ",180, 185, paint1);
        canvas.restore();
        canvas.save();
        canvas.rotate(90,230,185);
        canvas.drawText("Text using Typeface ", 230, 185, paint1);
        canvas.restore();
        canvas.save();

        this.setDrawingCacheEnabled(true);
        Bitmap c= Bitmap.createScaledBitmap(this.getDrawingCache(), canvas.getWidth(),canvas.getHeight(), false);

        /* Saving File To SD Card   */

        OutputStream outStream = null;
        File bgv = new File("/sdcard/");
        /* To build directory if needed */
        bgv.mkdirs();

        File file = new File(bgv, "final22.jpg");

        try {
        outStream = new FileOutputStream(file);
        c.compress(Bitmap.CompressFormat.JPEG, 100, outStream);

        outStream.flush();
        outStream.close();

      } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

       } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }

    }

}

私のコードに問題はありますか?

助けてください...

前もって感謝します :)

4

2 に答える 2

1

最後に、画像処理に関する多くの調査の後、私は答えを得ました。キャンバスに描かれたものとまったく同じ jpg を保存するには、2 行のコードを追加するだけです。最初は:

setDrawingCacheQuality(DRAWING_CACHE_QUALITY_HIGH);

2 番目の onDraw では、私のコードを参照して、AntiAlias を true に設定する必要があります

paint1.setAntiAlias(true);

ただし、この後も保存された画像は、キャンバスに描かれたものと同じ品質ではありません。同じ鮮明な画像品質を得るには、この 2 つのコードでうまくいきます

paint1.setDither(true);
paint1.setFilterBitmap(true);

ディザは主に滑らかなコーナーを提供します。アンチエイリアス、ディザ、および FilterBitmap は、キャンバスにビットマップを描画するときにも使用できます。

Dither と AntiAlias の詳細については、こちらのリンクを参照してください。

アンチエイリアス

ディザ

于 2012-09-26T09:24:30.220 に答える
0

キャンバスの描画キャッシュが期待どおりに返されていないようです。次のようなものを使用して、ビットマップに直接ブリットできます。

Bitmap myBitmap = new Bitmap(width, height, Config.ARGB_8888);
canvas.setBitmap(myBitmap);
... draw your text, etc ...

次にmyBitmap、ディスクに保存します。キャンバスに描画するものはすべてビットマップに描画する必要があります。

于 2012-09-23T22:51:56.187 に答える