[英]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.