简体   繁体   English

使用Canvas和canvas.scale(Scale,Scale)的图像质量问题;

[英]Image Quality problems using Canvas and canvas.scale(Scale, Scale);

I am having Image Quality problems using Canvas and canvas.scale(Scale, Scale); 我在使用Canvas和canvas.scale(Scale,Scale)时出现图像质量问题; they look exactly like the following: 它们看起来完全像以下内容:

android: quality of the images resized in runtime android:在运行时调整大小的图像的质量

I believe I have read all the posts on image quality problems when re-sizing bitmaps, but it doesn't seem to help when scaling with a Canvas scale(float scale). 我相信我在重新调整位图大小时已经阅读了有关图像质量问题的所有文章,但是在使用Canvas比例(浮动比例)进行缩放时似乎没有帮助。

I have tried many different options as suggested by the image quality posts. 我尝试了许多不同的选项,如图像质量帖子所建议。

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);

I believe this the last barrier to achieving my goals. 我相信这是实现目标的最后障碍。 I am quite concerned as I am in trouble if I can't get the image quality problem solved. 我很担心,因为如果无法解决图像质量问题,我会遇到麻烦。 Any help is appreciated. 任何帮助表示赞赏。

Thanks! 谢谢!

The system will not let me post a picture, so following is a link. 系统不允许我发布图片,因此下面是一个链接。

PictureSample 图片样本

I don't no whether my answer is correct or not i have a code for canvas. 我不是我的答案是否正确,我是否有适用于画布的代码。 i wish this might help you. 我希望这对您有帮助。

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);
        }
    }

}

I tried many and many code. 我尝试了很多代码。 I just add this in my manifest and I had the best quality image. 我只是将其添加到清单中,所以我得到了质量最好的图像。

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

I think the problem is the canvas is created in low resolution. 我认为问题在于画布是在低分辨率下创建的。 If u try to print on the screen the resolution of your device, u can see it is wrong. 如果您尝试在屏幕上打印设备的分辨率,您会发现它是错误的。 With the add in the manifest the resolution change. 随着清单中的添加,分辨率发生变化。

Do you have a screenshot that would show the quality issue you are talking about? 您是否有一个截图可以显示您所谈论的质量问题? If filtering is enabled on the Paint it should be fine. 如果在Paint上启用了过滤,则应该可以。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM