简体   繁体   English

重新缩放ImageView的位图时,图像质量下降

[英]Deterioration of image quality when re-scaling the Bitmap of an ImageView

So I have an ImageView to which I have set an OnTouchListener. 所以我有一个ImageView,我已经为其设置了OnTouchListener。 The OnTouch method is shown below. OnTouch方法如下所示。

//Touch event related variables
int touchState;
final int IDLE = 0;
final int TOUCH = 1;
final int PINCH = 2;
float dist0, distCurrent;

public boolean onTouch(View view, MotionEvent event) {
    boolean handledHere = false;

    float distx, disty;

    final int action = event.getAction();

    switch(action & MotionEvent.ACTION_MASK){           
    case MotionEvent.ACTION_DOWN:
        //A pressed gesture has started, the motion contains the initial starting location.
        touchState = TOUCH;
        break;
    case MotionEvent.ACTION_POINTER_DOWN:
        //A non-primary pointer has gone down.
        touchState = PINCH;

        //Get the distance when the second pointer touch
        distx = event.getX(0) - event.getX(1);
        disty = event.getY(0) - event.getY(1);
        dist0 = FloatMath.sqrt(distx * distx + disty * disty);

        break;
    case MotionEvent.ACTION_MOVE:
        if(touchState == PINCH){                        
            //Get the current distance
            distx = event.getX(0) - event.getX(1);
            disty = event.getY(0) - event.getY(1);
            distCurrent = FloatMath.sqrt(distx * distx + disty * disty);

            drawMatrix((ImageView) view);

        } else {
            handledHere = startDrag (view);
        }

        break;
    case MotionEvent.ACTION_UP:
        //A pressed gesture has finished.
        touchState = IDLE;
        break;
    case MotionEvent.ACTION_POINTER_UP:
        //A non-primary pointer has gone up.
        touchState = TOUCH;
        break;

    }

    return handledHere;
}

private void drawMatrix(ImageView view){
    float curScale = distCurrent/dist0;

    if (curScale < 0.5){
        curScale = 0.5f;    
    } else if (curScale > 1.5){
        curScale = 1.2f;
    }

    Bitmap originalBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); //view.getDrawingCache();
    Canvas canvas = new Canvas(originalBitmap);
    view.draw(canvas);
    int[] originalSize = (int[]) view.getTag();
    int newHeight = (int) (originalSize[1] * curScale); 
    int newWidth = (int) (originalSize[0] * curScale); 

    view.setImageBitmap(getResizedBitmap(originalBitmap, newHeight, newWidth));
    view.getLayoutParams().height=newHeight;
    view.getLayoutParams().width=newWidth;

}

private Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
    int width = bm.getWidth();
    int height = bm.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    // create a matrix for the manipulation
    Matrix matrix = new Matrix();
    // resize the bit map
    matrix.postScale(scaleWidth, scaleHeight);
    // recreate the new Bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
    return resizedBitmap;
}

The thing is, when I zoom in or out using finger gesture, the quality of the image deteriorates. 问题是,当我使用手指手势放大或缩小时,图像质量会下降。 For example, if the image is a PNG one, with a semi-transparent gradient, the gradient will become a solid blurred color, and the rest of the image becomes pixelated... Anybody has a solution for this, or come across the same problem? 例如,如果图像是带有半透明渐变的PNG图像,则渐变将变为纯色模糊的颜色,其余图像变为像素化...任何人对此都有解决方案,或者遇到相同的问题问题?

在getResizedBitmap()中添加过滤:

Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);

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

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