Проблемы с качеством изображения при использовании Canvas и canvas.scale (Scale, Scale); - PullRequest
1 голос
/ 22 января 2012

У меня проблемы с качеством изображения при использовании Canvas и canvas.scale (Scale, Scale); они выглядят в точности так:

android: качество изображений, измененных во время выполнения

Мне кажется, что я прочитал все сообщения о проблемах качества изображения при изменении размера растровых изображений, но, похоже, это не помогает при масштабировании по шкале холста (float scale).

Я пробовал много разных опций, как указано в сообщениях о качестве изображения.

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inDither = false;
options.inSampleSize = 1;
options.inScaled = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;//I thought this would do it
CurrentPicture = BitmapFactory.decodeFile(path, options);//Also tried decodeStream()


PicturePaint = new Paint();
//PicturePaint = new Paint(Paint.FILTER_BITMAP_FLAG); //I also tried this
//PicturePaint = new Paint(Paint.ANTI_ALIAS_FLAG);  //I also tried this
canvas.scale(Scale, Scale);
canvas.drawBitmap(CurrentPicture, 0, 0, PicturePaint);

Я считаю, что это последний барьер для достижения моих целей. Я весьма обеспокоен, поскольку у меня проблемы, если я не могу решить проблему качества изображения. Любая помощь приветствуется.

Спасибо!

Система не позволит мне опубликовать изображение, поэтому следующая ссылка.

PictureSample

Ответы [ 3 ]

3 голосов
/ 22 января 2012

Не знаю, правильный ли мой ответ или нет, у меня есть код для canvas.Я хотел бы, чтобы это могло помочь вам.

public class FotosurpriseActivity extends Activity {
    /** Called when the activity is first created. */
    Bitmap overlay;
    Paint pTouch;
    int X = -100;
    int Y = -100;
    Canvas c2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.android);
        Bitmap mBitmapover = BitmapFactory.decodeResource(getResources(), R.drawable.ss);
        overlay = BitmapFactory.decodeResource(getResources(), R.drawable.ss).copy(Config.ARGB_8888, true);
        c2 = new Canvas(overlay);

        pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);
        // pTouch.setXfermode(new PorterDuffXfermode(Mode.TARGET);
        pTouch.setColor(Color.TRANSPARENT);
        pTouch.setMaskFilter(new BlurMaskFilter(15, Blur.NORMAL));
        setContentView(new BitMapView(this, mBitmap, mBitmapover));
    }

    class BitMapView extends View {
        Bitmap mBitmap = null;
        Bitmap mBitmapover = null;

        public BitMapView(Context context, Bitmap bm, Bitmap bmover) {
            super(context);
            mBitmap = bm;
            mBitmapover = bmover;
        }

        @Override
        public boolean onTouchEvent(MotionEvent ev) {

            switch (ev.getAction()) {

            case MotionEvent.ACTION_DOWN: {

                X = (int) ev.getX();
                Y = (int) ev.getY();
                invalidate();

                break;
            }

            case MotionEvent.ACTION_MOVE: {

                X = (int) ev.getX();
                Y = (int) ev.getY();
                invalidate();
                break;

            }

            case MotionEvent.ACTION_UP:

                break;

            }
            return true;
        }

        @Override
        protected void onDraw(Canvas canvas) {
            // called when view is drawn
            Paint paint = new Paint();
            paint.setFilterBitmap(true);
            // The image will be scaled so it will fill the width, and the
            // height will preserve the image’s aspect ration
            /*
             * double aspectRatio = ((double) mBitmap.getWidth()) /
             * mBitmap.getHeight(); Rect dest = new Rect(0, 0,
             * this.getWidth(),(int) (this.getHeight() / aspectRatio)); double
             * aspectRatio2 = ((double) mBitmapover.getWidth()) /
             * mBitmapover.getHeight(); Rect dest2 = new Rect(0, 0,
             * this.getWidth(),(int) (this.getHeight() / aspectRatio2));
             * canvas.drawBitmap(mBitmap, null, dest, paint);
             * canvas.drawBitmap(mBitmapover, null, dest2, paint);
             */

            // draw background
            canvas.drawBitmap(mBitmap, 0, 0, null);
            // copy the default overlay into temporary overlay and punch a hole
            // in it
            c2.drawBitmap(mBitmapover, 0, 0, null); // exclude this line to show
                                                    // all as you draw
            c2.drawCircle(X, Y, 80, pTouch);
            // draw the overlay over the background
            canvas.drawBitmap(overlay, 0, 0, null);
        }
    }

}
0 голосов
/ 01 июня 2013

Я пробовал много и много кода.Я просто добавил это в свой манифест, и у меня было изображение наилучшего качества.

<uses-sdk android:minSdkVersion="9" />

Я думаю, проблема в том, что холст создается в низком разрешении.Если вы попытаетесь напечатать на экране разрешение вашего устройства, вы увидите, что это неправильно.С добавлением в манифест разрешение меняется.

0 голосов
/ 22 января 2012

У вас есть скриншот, который показывает проблему качества, о которой вы говорите? Если на Paint включена фильтрация, все должно быть в порядке.

...