不同手机截屏图片像素不匹配解决方案

针对在不同品牌手机上进行屏幕截图出现的尺寸不准确及多余像素问题,本文详细记录了一种解决方案,通过重新处理图像数据,确保截图尺寸精确,适用于Android5.0及以上版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目需要循环的截屏分析数据,实践后发现下面这篇可以使用

Android 5.0及以上实现屏幕截图

但是里面方法存在一个问题,手机截取的图片在小米手机1080×1920中截屏图片缩放且有黑色外框

在vivo手机上截屏发现宽度多截了8px

经过查找发现问题出现在下面这段代码中

        Image image = mImageReader.acquireLatestImage();
        if (image == null) {
//            Log.e(TAG, "image is null.");
            return null;
        }
        Log.e(TAG,"截图时间:"+(System.currentTimeMillis()-begintime));
        int width = image.getWidth();
        int height = image.getHeight();
        final Image.Plane[] planes = image.getPlanes();
        final ByteBuffer buffer = planes[0].getBuffer();
        int pixelStride = planes[0].getPixelStride();
        int rowStride = planes[0].getRowStride();
        int rowPadding = rowStride - pixelStride * width;
        Bitmap bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);
        bitmap.copyPixelsFromBuffer(buffer);
        image.close();

修改方法:

        Image image = imageReader.acquireLatestImage();
        if (image == null) {
//            Log.e(TAG, "image is null.");
            return null;
        }
        Log.e(TAG,"截图时间:"+(System.currentTimeMillis()-begintime));
        int width = image.getWidth();
        int height = image.getHeight();
        final Image.Plane[] planes = image.getPlanes();
        final ByteBuffer buffer = planes[0].getBuffer();

       //IntBuffer intBuffer = buffer.order(ByteOrder.BIG_ENDIAN).asIntBuffer();
        int pixelStride = planes[0].getPixelStride();
        int rowStride = planes[0].getRowStride();
        int rowPadding = rowStride - pixelStride * width;
        byte[] array = new byte[buffer.remaining()];
        Log.e(TAG,"arr:"+array.length);
        buffer.get(array,0,array.length);
        int[] iarr = new int[array.length/4];
        for (int i = 0; i < array.length/4; i++) {
            int i1 = ((int)array[i*4])&0xFF;
            int i2 = ((int)array[i*4+1])&0xFF;
            int i3 = ((int)array[i*4+2])&0xFF;
            int i4 = ((int)array[i*4+3])&0xFF;
           iarr[i]= (i1<<16)|(i2<<8)|(i3<<0)|(i4<<24);
           //r,g,b,a
           //argb
        }
        Bitmap bitmap = Bitmap.createBitmap(metric, iarr, 0, rowStride/4, width, height, Bitmap.Config.ARGB_8888);
        image.close();
        StreamTool.saveBitmap(bitmap,"test"+System.currentTimeMillis()+".png");


个人记录,以备参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值