11

截屏并创建带有裁剪图片的位图时出现错误

下面是我的代码

    View v1 = mKittyBGLayer.getRootView();
    v1.setDrawingCacheEnabled(true);
    Bitmap source = v1.getDrawingCache();
    int width = source.getWidth();
    int height = source.getHeight();
    System.out.println("vListView : -"+vListView.getWidth());
    System.out.println("hListView : -"+hListView.getHeight());
    System.out.println("Width : -"+width);
    System.out.println("Height : -"+height);
    bitmap = Bitmap.createBitmap(source, vListView.getWidth(), 0, width, height - hListView.getHeight());

我的日志猫是

        11-01 11:00:31.419: I/System.out(1658): vListView :- 60
        11-01 11:00:31.429: I/System.out(1658): hListView :- 60
        11-01 11:00:31.429: I/System.out(1658): Width :- 480
        11-01 11:00:31.429: I/System.out(1658): Height :- 320
        11-01 11:00:31.429: D/AndroidRuntime(1658): Shutting down VM
        11-01 11:00:31.429: W/dalvikvm(1658): threadid=1: thread exiting with uncaught exception  (group=0x40018560)
        11-01 11:00:31.429: E/AndroidRuntime(1658): FATAL EXCEPTION: main
        11-01 11:00:31.429: E/AndroidRuntime(1658): java.lang.IllegalArgumentException: x + width  must be <= bitmap.width()
        11-01 11:00:31.429: E/AndroidRuntime(1658):     at android.graphics.Bitmap.createBitmap(Bitmap.java:410)
        11-01 11:00:31.429: E/AndroidRuntime(1658):     at android.graphics.Bitmap.createBitmap(Bitmap.java:383)
        11-01 11:00:31.429: E/AndroidRuntime(1658):     at com.appsehs.android.CUTECRAZYKITTENDRESSUPGAME.PhotoSortrActivity.takeScreenShot(PhotoSortrActivity.java:247)
        11-01 11:00:31.429: E/AndroidRuntime(1658):     at com.appsehs.android.CUTECRAZYKITTENDRESSUPGAME.PhotoSortrActivity.onOptionsItemSelected(PhotoSortrActivity.java:274)
        11-01 11:00:31.429: E/AndroidRuntime(1658):     at android.app.Activity.onMenuItemSelected(Activity.java:2205)

在这里你可以看到 x < bitmap.getWidth 的意思是 60 < 480

虽然我收到错误

4

4 回答 4

24

不,不是x must be < bitmap.width()。它说x + width must be <= bitmap.width()

您正在创建一个Bitmap这样的:

Bitmap.createBitmap(source, 60, 0, 480, 260); // 320 - 60 = 260

基本上,你是x = 60, y = 0x = 480 + 60, y = 260一个Bitmap只有 480x320 的地方画图。显然,这是不可能的,因为您的x坐标不在Bitmap.

在不知道您的确切用例的情况下,很难告诉您如何解决此问题。基本上,您的source图像必须适合{ x1: x, x2: x + width, y1: y, y2: y + height }.

如果你只想从第 60 个像素开始绘制,那么你需要这样做:

Bitmap.createBitmap(source, vListView.getWidth(), 0, width - vListView.getWidth(), height - hListView.getHeight());
于 2012-11-01T05:40:19.680 回答
1
Bitmap resultBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0,
        sourceBitmap.getWidth() - 1, sourceBitmap.getHeight() - 1);

就像在列表中一样,它从 0 开始,所以宽度必须是位图宽度 - 1。

于 2013-09-09T09:29:28.147 回答
0

如果您从 drawable 获取图像,则将其添加到 drawable-nodpi 文件夹中。

我有同样的问题。现在,完美地工作。

于 2019-06-07T07:29:19.037 回答
0

如果你得到 java.lang.IllegalArgumentException: x must be < bitmap.width()

这是三星 6.0.1 版本的系统崩溃。此刻我找不到原因。

于 2019-12-16T09:13:05.033 回答