水反射对位图的影响

时间:2014-02-12 07:22:53

标签: android image bitmap effect bitmapimage

我试图在位图上实现水反射效果。正如我看到一些叫水反射的应用程序。我知道如何对图像进行反射,但图像上的波浪让我对它的完成方式感到困惑。

请参阅此图片

enter image description here

我在位图操作上做了很多应用,但这很难实现。 所以任何想法从哪里开始。只是一个想法开始可能会有所帮助。

4 个答案:

答案 0 :(得分:3)

对于任何需要的人,我尝试了一些简单的技巧,以获得与水反射效果更接近的效果。它不是很好,但对我来说看起来很好。

我使用了两种方法

位图反射方法(将位图作为参数)

  public static Bitmap Reflection(Bitmap imageBitmap) {

           int width = imageBitmap.getWidth();
           int height = imageBitmap.getHeight();

           Matrix matrix = new Matrix();
           matrix.preScale(1, -1);

          Bitmap reflectionImage = Bitmap.createBitmap(imageBitmap, 0,
                   0, width, height , matrix, false);

          Bitmap newbit=Bitmap.createScaledBitmap(reflectionImage, reflectionImage.getWidth()/8, reflectionImage.getHeight()/8, true);

          Bitmap newbit1=Bitmap.createScaledBitmap(newbit, newbit.getWidth()*8, newbit.getHeight()*8, true);

          Bitmap scalednew=Bitmap.createScaledBitmap(newbit1, width, height-(height/4), true);

          Bitmap newscaledone=overlay(scalednew);

       reflectionImage=newscaledone;

           Bitmap reflectedBitmap = Bitmap.createBitmap(width,
                   (height + height), Config.ARGB_8888);

           Canvas canvas = new Canvas(reflectedBitmap);
           canvas.drawBitmap(imageBitmap, 0, 0, null);
           Paint defaultPaint = new Paint();
           canvas.drawRect(0, height, width, height, defaultPaint);

           canvas.drawBitmap(reflectionImage, 0, height , null);
           Paint paint = new Paint();

           paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
           canvas.drawRect(0, height, width, reflectedBitmap.getHeight()
                    , paint);
               return reflectedBitmap;

}

位图叠加方法。我正在采用具有一些不透明度的波形位图来覆盖反射图像。所以它看起来像水。

 Bitmap wavebitmap=BitmapFactory.decodeResource(getResources(), R.drawable.waves1);

private static Bitmap overlay( Bitmap bmp2) {
     Bitmap bmp1=WaterReflectionMainActivity.wavebitmap;

      Bitmap bmp1new =Bitmap.createScaledBitmap(bmp1, bmp2.getWidth(), bmp2.getHeight(), true);

        Bitmap bmOverlay = Bitmap.createBitmap(bmp1new.getWidth(), bmp1new.getHeight(), bmp1new.getConfig());
        Canvas canvas = new Canvas(bmOverlay);
        canvas.drawBitmap(bmp2, new Matrix(), null);
        canvas.drawBitmap(bmp1new, new Matrix(), null);
        return bmOverlay;
    }

这是我的水效果版本,我知道这看起来很糟糕。 因此,如果有人仍然有更好的效果,请分享您的代码。 谢谢

答案 1 :(得分:2)

与此相关的教程:http://www.xaraxone.com/webxealot/workbook34/page_4.htm 另请阅读此问题:Add water effect on bitmap android。 阅读这两本书,我希望你能从中得到一个想法

您可能还想查看以下内容:123

答案 2 :(得分:2)

这只是一个想法,但基本上,你需要的是在图像的底部应用变形,这意味着对于下半部分的每个像素,你计算一个位置,从顶部图片中获取它的颜色。

这是一个伪代码,为您提供一个提示:

for (int x = 0;  x < width; x++) {

    for (int y = 0; y < img.height; y++) {

        // Compute a position on the original image
        // tweak the values heres to get the effect you want
        sourceX = x + (int) (cos(10000.0 / y) * 20); 
        sourceY = img.height - y - 1 +(int)( sin(y* 0.5) * 20); 

        // Maybe check the range of sourceX and source Y

        int color = img.getColor(sourceX, sourceY) 

        outptut.setColor(x, y + img.height, color); 
   }
}

答案 3 :(得分:1)