2011年5月16日星期一

  Bitmap.createBitmap方法的x,y的值设置为10,10,设置为-10,-10报错

之前有用到Bitmap.createBitmap方法,搞了N久,跟楼主有一样的问题,一张图片下去截,怎么截都出不来,老报错,郁闷了好久。。。
     终于在我不断努力的实验下,终于找到了答案。希望这篇文章能够解决各位的问题。
关于Bitmap.createBitmap方法的注意事项:
                 1:  你可以试着打印 Bitmap bmp = Bitmap.creatBitmap(....);  创建出来的 bmp 的高度和宽度,你看下是不是比原图要小。如果是,那么你找到了问题的所在,据我测试了解到,在 drawable下面的资源如果你的图片很大,android会自动处理成合适的。当你还按照原来的尺寸大小去截图的话,肯定会报错。
        Bitmap bmp = Bitmap.createBitmap(bitmap, x, y, width, height); 中有这样的规定:  x + width <= bmp.getWidth();  y + height <= bmp.getHeight();  否则报错。
           2:解决办法:将资源文件不放在 drawable 下面,是不是就不会android自动处理了。经过实验确实如此。那么我想到可以放到 assets 下面(并且assets下面是可以建自己的包的。在取的时候只需要把包名加上)
然后再用createBitmap()方法去截取,这样截取出来的图片(只要你的参数设置合理)都没有问题。                                AssetManager am = this.getAssets();
                        InputStream is = am.open("common_enter.png");    //放在assets目录下面; 如果有包,如: public 包 , InputStream is = am.open("pulbic/common_enter.png");  
                        Bitmap bitmap = BitmapFactory.decodeStream(is);
                        bitmap = Bitmap.createBitmap(bitmap, 6, 892, 348, 119);
                3 :如果要确认的话,可以将图片输出到sdcard里面,然后去DDMS里面pull出来看一下是不是你想要的结果。
                                FileOutputStream fos = null;
                try {
                        AssetManager am = this.getAssets();
                        InputStream is = am.open("common_enter.png");
                        Bitmap bitmap = BitmapFactory.decodeStream(is);
                        bitmap = Bitmap.createBitmap(bitmap, 6, 892, 348, 119);
                        fos = openFileOutput("image", Context.MODE_PRIVATE);
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 60, fos);
                        System.out.println("==w=="+bitmap.getWidth());
                        System.out.println("==h=="+bitmap.getHeight());
                } catch (Exception e) {
                } finally {
                        if (fos != null) {
                                try {
                                        fos.flush();
                                        fos.close();
                                } catch (IOException e) {
                                }
                        }
                }

没有评论:

发表评论