Android - 如何使用视图布局尺寸裁剪 jpeg
Posted
技术标签:
【中文标题】Android - 如何使用视图布局尺寸裁剪 jpeg【英文标题】:Android - How crop jpeg using view layout dimensions 【发布时间】:2013-03-01 18:46:00 【问题描述】:新手用户问题:
我已经搜索和试验了几天,需要一些帮助。我可能已经阅读了有关此主题的所有 SO 帖子,但我仍然无法弄清楚。
我正在尝试裁剪相机预览图像的特定区域。问题是蓝色框是由顶部 = 150 和左侧 = 38,高度 = 292 和宽度 = 600 的布局定义的。图像的高度 = 2448 和宽度 = 3264。
大框是相机预览屏幕,小框是我要裁剪的部分(显然我还没有能力发布图片)。
----------------------------------------- | | | | | | | --------- | | | | | | --------- | | | -----------------------------------------如何裁剪图像,以便只剩下框中的部分?我将在另一个活动中展示它,所以我不担心那部分。
更复杂的是,盒子大小和图像大小会因手机而异,我需要使用 API 8(2.2 版,Froyo)。
我也不想将图像保存到文件中,因为那样我必须对其进行加密(图片将是存款支票的图像)。
我正在使用 Camera.takePicture() 和 jpegCallback,如下面的代码 sn-p(initialBitmap 是上面的“大盒子”,而 rl 是“小盒子”):
PictureCallback jpegCallback = new PictureCallback()
public void onPictureTaken(byte[] data, Camera camera)
if ( data != null && data.length > 0 )
Bitmap initialBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
int bitmapHeight = initialBitmap.getHeight();
int bitmapWidth = initialBitmap.getWidth();
// get the "picture" frame
RelativeLayout rl = (RelativeLayout) findViewById( R.id.clear_layout );
int frameX = rl.getLeft();
int frameY = rl.getTop();
int frameHeight = rl.getHeight();
希望视图坐标/尺寸和位图之间存在简单的数学关系。
我也对任何更好的处理方式持开放态度,但我尝试使用预览数据本身(太小)和操作位图(内存不足错误)。
提前致谢。
【问题讨论】:
如果您知道要获取的框的位置,为什么要从相对布局中获取信息?为什么不直接使用问题开头的信息和 Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height) 来获取新位图中的小节? 尽管您说已经阅读了所有图像裁剪,但您检查过这个答案吗? ***.com/a/9388244/1657165 我了解如何裁剪图像。我遇到的问题是我不知道图像中的 x、y、宽度、高度,基于活动布局上显示的 RelativeLayout 的顶部、左侧、宽度、高度。 (即布局为 442 x 960 像素,但 jpeg 图片为 2448 x 3264 像素)。是什么关系?我尝试过缩放,但似乎预览之外还有更多图片导致数学关闭。 【参考方案1】:万一有人关心,我从来没有找到这个问题的答案。我最终以不同的方式解决了这个问题。我使用了完整的预览区域,只是让我的“拍照”按钮足够透明,不会碍事。我也从未裁剪过,但图像大小接近裁剪后的大小。
根据我去年学到的所有知识,我认为预览大小和生成的 jpg 文件大小之间没有关系。对于不同的手机摄像头,这种关系似乎有所不同。
如果有人找到了关系,我仍然很乐意了解它。
【讨论】:
以上是关于Android - 如何使用视图布局尺寸裁剪 jpeg的主要内容,如果未能解决你的问题,请参考以下文章
使用“com.android.camera.action.CROP”意图裁剪图像,在某些设备上返回小尺寸位图