2014-02-12 2 views
2

Я пытаюсь достичь эффекта отражения воды на растровом изображении. Как я заметил, некоторые приложения называли отражение воды. Я знаю, как делать отражение изображения, но волна на изображении - это то, что заставляет меня смущаться тому, как это делается.Влияние отражения воды на растровое изображение

посмотреть изображение, например

enter image description here

Я сделал много приложений на манипуляции растровой, но это довольно трудно. Так что любая идея о том, с чего начать. Просто идея начать может быть полезна.

+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; 
    } 

Ну, это моя версия эффекта воды, я знаю, что это выглядит дерьмо. Итак, если у кого-то еще есть лучший эффект, пожалуйста, поделитесь своим кодом. спасибо

+0

Можете ли вы предоставить изображение волны, которое вы использовали –

+0

, можете предоставить то, что накладывается (растровое изображение) в коде ur – Prasad

2

Учебное пособие, связанное с этим: http://www.xaraxone.com/webxealot/workbook34/page_4.htm Также есть вопрос по этому вопросу: Add water effect on bitmap android. ли прочитанный на них обоих, я надеюсь, что вы получите представление от этого

Вы также можете посмотреть через них: 1, 2, 3

+0

Но нет учебника по водному эффекту, который указывает на android. Но хорошие источники ссылок. –

+0

@sandeep, делающий через android, должен быть похож, я думаю, не возражаете ли вы поставить галочку на мой ответ? –

+0

Да, я буду ждать еще более близких ответов, а затем отметьте ответ, который помог мне достичь моей цели. Я, несомненно, поддержу ваш ответ, поскольку у него есть хорошие источники. –

1
+0

Я уже пробовал маскировать, но это не похоже на эффект воды. но спасибо за ваш ответ. –

+0

Ваши ссылочные ссылки имеют эффект пульсации. Я имею в виду, как для livewallpaper или анимации. Но я хочу, чтобы эффект водной волны был по-прежнему растровым изображением. –

+0

Я знаю это, но я думал, что это поможет вам в логике, поэтому я опубликовал. – Hardik

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); 
    } 
} 
+0

У меня возникли сомнения. Во второй последней строке - «img.get». что мы пытаемся добраться сюда ..? –

+0

img - это оригинальное изображение, на которое вы хотите добавить отражение. Img.get фактически получает цвет в точке sourceX, sourceY. output.set на самом деле output.setColor (я отредактирую свой ответ соответственно) – XGouchet

+0

Я думаю, что что-то не так с кодом. Я получаю ошибку на int color line. –

Смежные вопросы