Android Studio中GPUImageView无法适配Bitmap,图片被放大裁剪求助
GPUImageView显示Bitmap放大裁剪问题的解决办法
问题根源
GPUImageView的默认渲染逻辑和原生ImageView不同,它默认会将图片拉伸填充到Surface的尺寸,而非适配自身布局大小,导致图片被放大裁剪。
解决方案
方案1:设置GPUImageView专属的ScaleType
GPUImageView有自己的ScaleType枚举(而非原生ImageView的ScaleType),正确设置后可适配显示:
val imageFilePath = intent.getStringExtra(Constants.PDF_CONVERTER_IMAGES_URL_CODE_FILTERS_ACTIVITY) if (imageFilePath != null) { bitmap = BitmapFactory.decodeFile(imageFilePath) binding.gpuimageview.setImage(bitmap) // 设置适配缩放类型,比如FIT_CENTER(按比例适配,不裁剪)或CENTER_INSIDE(适配容器且不超出) binding.gpuimageview.setScaleType(GPUImageView.ScaleType.FIT_CENTER) }
注:之前设置scaleType导致空白,大概率是误用了原生ImageView的ScaleType,必须使用
GPUImageView.ScaleType下的枚举值,且确保在设置图片后调用。
方案2:预缩放Bitmap适配GPUImageView容器尺寸
如果方案1无效,可手动计算缩放比例,生成适配容器的Bitmap后再设置:
val imageFilePath = intent.getStringExtra(Constants.PDF_CONVERTER_IMAGES_URL_CODE_FILTERS_ACTIVITY) if (imageFilePath != null) { bitmap = BitmapFactory.decodeFile(imageFilePath) // 等待GPUImageView布局完成后获取实际尺寸 binding.gpuimageview.post { val targetWidth = binding.gpuimageview.width val targetHeight = binding.gpuimageview.height val scaledBitmap = getScaledBitmap(bitmap, targetWidth, targetHeight) binding.gpuimageview.setImage(scaledBitmap) } } // 按比例缩放Bitmap的辅助方法 private fun getScaledBitmap(bitmap: Bitmap, maxWidth: Int, maxHeight: Int): Bitmap { val widthRatio = maxWidth.toFloat() / bitmap.width val heightRatio = maxHeight.toFloat() / bitmap.height // 取最小比例保证图片完整显示 val scaleRatio = min(widthRatio, heightRatio) val matrix = Matrix() matrix.postScale(scaleRatio, scaleRatio) return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true) }
方案3:调整布局参数
将GPUImageView的宽高设为match_parent,让它填充父容器,配合ScaleType适配:
<FrameLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" app:layout_constraintBottom_toTopOf="@+id/filters_recycler_view"> <jp.co.cyberagent.android.gpuimage.GPUImageView android:id="@+id/gpuimageview" android:layout_width="match_parent" android:layout_height="match_parent" app:gpuimage_show_loading="false" android:layout_gravity="center" app:gpuimage_surface_type="texture_view" /> </FrameLayout>
内容的提问来源于stack exchange,提问作者Khawaja Fakhar
相关产品推荐
相关产品推荐

