C#从二维数组构建Bitmap时如何获取原始像素值?
解决小尺寸Bitmap生成时的插值滤镜问题,获取原始像素值
兄弟,我太懂这种折腾小尺寸Bitmap却被插值滤镜坑的痛苦了!你遇到的模糊问题,本质是系统在Bitmap的绘制、展示环节默认开启了缩放插值,把你精心设置的黑白交替像素给糊成一团了。下面给你分场景说解决方案:
先确保Bitmap创建环节无损
从像素数组生成Bitmap时,一定要指定正确的颜色配置,别用默认的可能压缩的配置。比如在Android里,用ARGB_8888(支持全色彩+透明,最稳妥),避免颜色信息丢失:// 示例:假设你的像素数组是int[] pixels,宽width、高height Bitmap bitmap = Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888);绘制时强制关闭插值
如果是用Canvas绘制这个Bitmap,默认的Paint会自动开启滤镜插值,这就是模糊的元凶!必须手动关掉:Paint paint = new Paint(); paint.setFilterBitmap(false); // 核心:禁用插值滤镜 paint.setAntiAlias(false); // 顺带关掉抗锯齿,避免边缘额外模糊 canvas.drawBitmap(bitmap, xPos, yPos, paint);直接读取Bitmap的原始像素验证
要是你想确认Bitmap里的像素是不是和你设置的完全一致,可以直接从Bitmap中读取原始像素数组对比:int[] extractedPixels = new int[width * height]; // 把Bitmap的像素读取到数组里 bitmap.getPixels(extractedPixels, 0, width, 0, 0, width, height); // 现在extractedPixels就是Bitmap里的原始像素,和你最初的数组对比就行ImageView展示时避免缩放插值
如果是把Bitmap放到ImageView里显示,ImageView默认会对小图做缩放优化,得改两个设置:<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="center" <!-- 保持原始尺寸,不做缩放 --> android:layerType="software" <!-- 规避硬件加速带来的隐性插值 --> />或者在代码里动态设置:
imageView.setScaleType(ImageView.ScaleType.CENTER); imageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
要是你用的是其他平台(比如JavaFX、iOS),核心思路也一样——在创建Bitmap时用无损配置,在绘制/展示环节关闭所有插值、抗锯齿类的优化选项。
内容的提问来源于stack exchange,提问作者Jaume
相关产品推荐
相关产品推荐

