所以,我正在使用这个库 https://github.com/thuytrinh/android-collage-views将“MultiTouchListener”功能添加到我的 ImageView。基本上,我让用户根据自己的需要使用旋转、缩放和平移来修改照片。现在唯一的问题是如何保存它。我是这样做的:
Bitmap bitmap = Bitmap.createBitmap(imageContainer.getWidth(), imageContainer.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.WHITE);
imageContainer.draw(canvas);
它可以工作,但图像不够大 - 它与手机上的 View 一样大,因此它取决于屏幕分辨率。我想在给定的全尺寸位图上“应用”这些转换。我希望转换后的图像在屏幕上看起来像(因此它需要裁剪屏幕外的所有内容)
我尝试了以下方法:
Bitmap newBitmap = Bitmap.createBitmap(image.getWidth(), image.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(newBitmap);
canvas.drawColor(Color.WHITE);
Paint paint = new Paint();
paint.setAntiAlias(true);
canvas.drawBitmap(image, imageView.getMatrix(), paint);
但它看起来并不像预期的那样。
用户界面:
和输出图像(不裁剪,因为我不想裁剪哪一边):
我该如何解决这个问题?有什么解决办法吗?
最佳答案
这是一种方法,绝对不完美,但应该给你一个好的开始:
在此,container
指的是包含转换后的 ImageView
的 View 、屏幕截图上的手机壳和 src
原始源位图.
首先,您需要计算输出位图所需的宽度和高度,即在保持容器比例的同时使图像适合它的大小:
float containerWidth = containerView.getWidth(); float containerHeight = containerView.getHeight(); float srcWidth = src.getWidth(); float srcHeight = src.getHeight(); float containerRatio = containerWidth / containerHeight; float srcRatio = srcWidth / srcHeight; float outputWidth, outputHeight; if(srcRatio > containerRatio) { //fits in width outputWidth = srcWidth; outputHeight = srcWidth / containerRatio; } else if(srcRatio < containerRatio) { //fits in height outputHeight = srcHeight; outputWidth = srcHeight * containerRatio; } else { outputWidth = srcWidth; outputHeight = srcHeight; }
将容器宽度/高度与输出宽度/高度之间的比率应用到矩阵的转换部分,该部分包含用户所做的转换
float containerToOutputRatioWidth = outputWidth / containerWidth; float containerToOutputRatioHeight = outputHeight / containerHeight; float[] values = new float[9]; transformedImageView.getMatrix().getValues(values); values[2] = values[2] * containerToOutputRatioWidth; values[5] = values[5] * containerToOutputRatioHeight; Matrix outputMatrix = new Matrix(); outputMatrix.setValues(values);
使用正确的大小(outputWidth、outputHeight)和矩阵(outputMatrix)绘制输出位图。
Bitmap newBitmap = Bitmap.createBitmap(Math.round(outputWidth), Math.round(outputHeight), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(newBitmap); canvas.drawColor(Color.WHITE); Paint paint = new Paint(); paint.setAntiAlias(true); canvas.drawBitmap(src, outputMatrix, paint);
.
警告
你应该小心内存分配,这段代码会导致分配一些大量的位图,你应该实现某种符合你需要的限制。 (后台也做分配和绘图)
您可能需要根据最初放置图像的位置进行一些调整。
关于android - 在android上转换原始位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35277544/