得到一个bitmap的倒影

本文介绍了一种在Android应用中为ImageView中的图片添加倒影效果的方法。通过使用Bitmap和Canvas,结合矩阵变换和线性渐变实现了平滑过渡的倒影效果。

  项目中有这个需求,网上很多相关资料,很有用。现在我验证过的方法记录如下,以便以后查看。。(谢谢某网友的奉献,时间太久了,不知道源自何处了。呵呵)

public class ImageViewActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageView myImageView = (ImageView) this.findViewById(R.id.imageView1);  
        Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.movieonline_bookmark)).getBitmap();  
        myImageView.setImageBitmap(createReflectedImage(bitmap)); 
        
        
        ImageView myImageView1 = (ImageView) this.findViewById(R.id.imageView2);  
        Bitmap bitmap1 = ((BitmapDrawable) getResources().getDrawable(R.drawable.movieonline_bookmark)).getBitmap();  
        myImageView1.setImageBitmap(createReflectedImage(bitmap1)); 
    }
    
    private Bitmap createReflectedImage(Bitmap originalBitmap) {  
        // 图片与倒影间隔距离  
        final int reflectionGap = 4;  
          
        // 图片的宽度  
        int width = originalBitmap.getWidth();  
        // 图片的高度  
        int height = originalBitmap.getHeight();  
          
        Matrix matrix = new Matrix();  
        // 图片缩放,x轴变为原来的1倍,y轴为-1倍,实现图片的反转  

matrix.preScale(1, -1);

// 创建反转后的图片Bitmap对象,图片高是原图的一半。 如果不需要其他效果,此刻可以return; Bitmap reflectionBitmap = Bitmap.createBitmap(originalBitmap, 0, height / 2, width, height / 2, matrix, false); // 创建标准的Bitmap对象,宽和原图一致,高是原图的1.5倍。

Bitmap withReflectionBitmap = Bitmap.createBitmap(width, (height + height / 2 + reflectionGap), Config.ARGB_8888); // 构造函数传入Bitmap对象,为了在图片上画图 Canvas canvas = new Canvas(withReflectionBitmap); // 画原始图片 canvas.drawBitmap(originalBitmap, 0, 0, null); // 画间隔矩形 Paint defaultPaint = new Paint(); canvas.drawRect(0, height, width, height + reflectionGap, defaultPaint); // 画倒影图片 canvas.drawBitmap(reflectionBitmap, 0, height + reflectionGap, null); // 实现倒影效果 Paint paint = new Paint(); LinearGradient shader = new LinearGradient(0, originalBitmap.getHeight(), 0, withReflectionBitmap.getHeight(), 0x70ffffff, 0x00ffffff, TileMode.MIRROR); paint.setShader(shader); paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); // 覆盖效果 canvas.drawRect(0, height, width, withReflectionBitmap.getHeight(), paint); return withReflectionBitmap; } }

在Android平台上实现对Bitmap或资源图像进行模糊处理,可以通过多种方式来完成。这些方法包括使用系统提供的RenderScript、自定义高斯模糊算法、第三方库以及结合其他视觉效果(如倒影)等。以下是几种常见且有效的实现方案。 ### 1. 使用 RenderScript 实现模糊 RenderScript 是 Android 提供的一个高性能计算框架,特别适合图像处理任务。以下是一个使用 RenderScript 进行模糊处理的示例代码: ```java public Bitmap blurWithRenderScript(Bitmap source, int radius) { if (radius < 1 || radius > 25) { throw new IllegalArgumentException("Radius must be between 1 and 25."); } RenderScript rs = RenderScript.create(context); Allocation input = Allocation.createFromBitmap(rs, source); Allocation output = Allocation.createTyped(rs, input.getType()); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(input); script.forEach(output); Bitmap blurredBitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), source.getConfig()); output.copyTo(blurredBitmap); rs.destroy(); return blurredBitmap; } ``` 需要注意的是,`ScriptIntrinsicBlur` 的 `setRadius()` 方法设置的半径最大有效值为 25[^3]。如果需要更强烈的模糊效果,可以先对图片进行缩放以降低其分辨率,然后再应用模糊处理。 ### 2. 自定义高斯模糊算法 对于需要兼容低版本 Android 系统的应用程序,或者希望更精细地控制模糊过程的情况,可以手动实现高斯模糊算法。这种方法通常涉及卷积操作和权重矩阵的应用。以下是一个简化版的高斯模糊核心逻辑: ```java public Bitmap applyGaussianBlur(Bitmap original) { int width = original.getWidth(); int height = original.getHeight(); Bitmap blurred = Bitmap.createBitmap(width, height, original.getConfig()); int[][] kernel = { {1, 2, 1}, {2, 4, 2}, {1, 2, 1} }; for (int y = 1; y < height - 1; y++) { for (int x = 1; x < width - 1; x++) { int r = 0, g = 0, b = 0; for (int ky = -1; ky <= 1; ky++) { for (int kx = -1; kx <= 1; kx++) { int pixel = original.getPixel(x + kx, y + ky); int weight = kernel[ky + 1][kx + 1]; r += Color.red(pixel) * weight; g += Color.green(pixel) * weight; b += Color.blue(pixel) * weight; } } int red = r / 16; int green = g / 16; int blue = b / 16; blurred.setPixel(x, y, Color.rgb(red, green, blue)); } } return blurred; } ``` 上述代码中的 `kernel` 表示一个简单的 3x3 高斯核,可以根据需求调整其大小和权重分布以获得不同的模糊效果。 ### 3. 结合倒影模糊效果 为了增强视觉体验,还可以将模糊效果倒影效果相结合。这种组合常用于展示滚动视图或图片墙等场景。下面是一个整合了倒影和模糊的示例函数: ```java public Bitmap createReflectionWithBlur(Bitmap original, int blurRadius) { // 创建倒影图像 Bitmap reflection = createReflection(original); // 对倒影部分进行模糊处理 Bitmap blurredReflection = blurWithRenderScript(reflection, blurRadius); // 合并原始图像模糊后的倒影 Bitmap result = Bitmap.createBitmap(original.getWidth(), original.getHeight() * 2, original.getConfig()); Canvas canvas = new Canvas(result); canvas.drawBitmap(original, 0, 0, null); canvas.drawBitmap(blurredReflection, 0, original.getHeight(), null); return result; } private Bitmap createReflection(Bitmap original) { Matrix matrix = new Matrix(); matrix.preScale(1, -1); // 垂直翻转 return Bitmap.createBitmap(original, 0, 0, original.getWidth(), original.getHeight(), matrix, true); } ``` 通过这种方式,可以在不影响主图像清晰度的前提下,为用户提供更加丰富的视觉层次感。 ### 4. 第三方库支持 除了自行编写模糊处理逻辑外,还可以利用一些成熟的第三方库来简化开发流程。例如 [RoundedImageView](https://github.com/vinc3m1/RoundedImageView) 和 [Blurry](https://github.com/wasabeef/blurry) 等库提供了便捷的方法来实现高效的模糊效果,并且往往已经优化过性能问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值