我需要一些帮助。我有一个带触摸监听器的ImageView,我能够将所有触摸输入捕获到矩阵中,并将该矩阵应用于ImageView和VOILA!图像适当地平移和缩放。
这就是麻烦:我现在想以这样的方式对图像进行裁剪,使其始终保持相同的大小;例如300x300图像。
换句话说,假设我的屏幕中间有一个300x300的正方形,用户平移并缩放图像,直到感兴趣的项目适合该正方形,并点击" next"。我希望将拍摄照片的结果图像仅仅放在包装盒中的300x300部分。
有意义吗?请帮忙!谢谢同志们!请参阅下面的一些代码,了解到目前为止我所尝试的内容。
float[] matrixVals = new float[9];
ImageTouchListener.persistedMatrix.getValues(matrixVals);
model.setCurrentBitmap(Bitmap.createBitmap(model.getOriginalBitmap(), 0, 0, model.getTargetWidth(), model.getTargetHeight(), ImageTouchListener.persistedMatrix, true));
model.setCurrentBitmap(Bitmap.createBitmap(model.getCurrentBitmap(), Math.round(matrixVals[Matrix.MTRANS_X]), Math.round(matrixVals[Matrix.MTRANS_Y]), model.getTargetWidth(), model.getTargetHeight(), null, false));
最后,我还希望能够将图像缩小到框中,其中边缘可能实际上需要用黑色或白色或某种边框填充......到目前为止,我做的一切都不是当我点击下一个时,没有平移或缩放所有崩溃。
再次感谢!
答案 0 :(得分:1)
看到这个自定义ImageView,最重要的部分是onTouchEvent,其中创建了裁剪的Bitmap并将其保存到/ sdcard进行验证:
class IV extends ImageView {
Paint paint = new Paint();
Rect crop = new Rect();
public IV(Context context) {
super(context);
paint.setColor(0x660000ff);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
crop.set(w / 2, h / 2, w / 2, h / 2);
crop.inset(-75, -75);
}
@Override
public void setImageResource(int resId) {
super.setImageResource(resId);
setScaleType(ScaleType.MATRIX);
Matrix m = getImageMatrix();
m.postScale(2, 2);
m.postTranslate(40, 30);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Bitmap croppedBitmap = Bitmap.createBitmap(crop.width(), crop.height(), Config.ARGB_8888);
Canvas c = new Canvas(croppedBitmap);
c.translate(-crop.left, -crop.top);
c.concat(getImageMatrix());
getDrawable().draw(c);
// just save it for test verification
try {
OutputStream stream = new FileOutputStream("/sdcard/test.png");
croppedBitmap.compress(CompressFormat.PNG, 100, stream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return false;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(crop, paint);
}
}
答案 1 :(得分:0)
我不清楚你的问题是什么,计算或绘图问题......如果是绘图问题我可能有解决方案......
创建一个新的位图,获取画布并将大图像的正确矩形绘制到新的小图像中....
Bitmap bigPicture; //your big picture
Bitmap bitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bitmap);
Rect source = ...
Rect dest = ...
c.drawBitmap(bigPicture, source, dest, paint);
现在,如果您的问题是计算问题,我可能也有解决方案......