java Android - 以编程方式处理图像缩放/裁剪

Posted

技术标签:

【中文标题】java Android - 以编程方式处理图像缩放/裁剪【英文标题】:java Android - working with image scaling/cropping programmatically 【发布时间】:2013-08-19 11:13:29 【问题描述】:

好吧,这一切折磨了我好几个星期,我设置了一个 227 像素高的图像,将其缩放到 170 像素,即使我希望它是 wrap_content 每当我这样做的时候。

好的。在这里,我拍摄了 1950 像素长的 My Image(我将其中的一部分放在这里,以便您了解它的外观)。

首先,我想将其缩放回 227 像素高,因为它是这样设计的,应该是这样的

Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.ver_bottom_panel_tiled_long);
            int width = bitmapOrg.getWidth();
        int height = bitmapOrg.getHeight();
        int newWidth = 200; //this should be parent's whdth later
        int newHeight = 227;

        // calculate the scale
        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(bitmapOrg, 0, 0, 
                          width, height, matrix, true); 


        BitmapDrawable dmpDrwbl=new BitmapDrawable(resizedBitmap);

    verbottompanelprayer.setBackgroundDrawable(dmpDrwbl);

所以...这根本不是裁剪图像 - 不,它是 1950 像素压入 200 像素。

但我只想剪掉除这 200 像素或我要设置的任何宽度之外的任何东西 - 剪裁它,而不是将所有这些长图像压入 200 像素区域。

还有,BitmapDrawable(Bitmap bitmap);和 imageView.setBackgroundDrawable(drawable);已弃用 - 我该如何更改?

【问题讨论】:

【参考方案1】:

根据我所见,您创建了一个新尺寸 (200x227) 的位图,所以我不确定您的预期。你甚至在你缩放的 cmets 中写了,没有关于裁剪的消息......

你可以做的是:

    如果 API 至少为 10(姜饼),您可以使用 BitmapRegionDecoder ,使用 decodeRegion :

    如果 API 太旧,则需要解码大位图,然后将其裁剪为新位图,使用 Bitmap.createBitmap

类似这样的:

final Rect rect =...
if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD_MR1)
  
  BitmapRegionDecoder decoder=BitmapRegionDecoder.newInstance(imageFilePath, true);
  croppedBitmap= decoder.decodeRegion(rect, null);
  decoder.recycle();
  
else 
  
  Bitmap bitmapOriginal=BitmapFactory.decodeFile(imageFilePath, null);
  croppedBitmap=Bitmap.createBitmap(bitmapOriginal,rect.left,rect.top,rect.width(),rect.height());
  

【讨论】:

你能给我举个例子,如何用 Bitmap.CreateBitmap 裁剪它吗?它仍然不裁剪,只是尝试将整个图像放入其中。可能我做错了什么? 你检查过我刚刚给你的链接吗?您需要使用正确的功能。不管怎样,我已经写了一个示例代码,虽然我不确定它是否编译得很好。 好吧,这就是问题所在 - 我想使用 BitmapRegionDecoder 但它只适用于文件。但我想将它与资源 - 不同的 dpi 一起使用。处理文件会使事情复杂化。有没有办法将 BitmapRegionDecoder 与资源一起使用? 请阅读我给你的内容。我不能在一个地方教你关于 android 的所有东西......它不仅仅是用于文件。我只展示了一个例子。您也可以使用 inputStream 或 fileDescriptor。例如,您可以使用 getResources().openRawResource(R.drawable....) 这对我来说太疯狂了............我从资源中获取了一张图片......原来是 227 像素......如果我使用 getHeight - 它返回 170 pix。如果我把它放在 bitmap.xml 中 - 它将是 170 像素。但如果我裁剪它 - 高度将再次变为 227 像素!!!怎么回事???

以上是关于java Android - 以编程方式处理图像缩放/裁剪的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 Android 中获取图像按钮的宽度和高度

以编程方式在 Android 中为视频添加图像帧或水印

[Android - Kitkat ]以编程方式从 Android 的内置图库应用程序中获取/选择图像

每次我在前端放大/缩小时,如何以编程方式检查 Altair 图表的放大/缩小功能

如何以编程方式在android资源文件中设置项目windowBackground

提高android应用程序中以编程方式捕获的图像的质量[重复]