2013-05-09 4 views
0

Я искал растягивание, как алгоритм деформации, применяемый в моем приложении для хранения Windows 8. Я нашел этот код для Android (java) ниже. Большинство вещей я могу порт на C#, но некоторые специфические вещи Android sdk размыты для меня, чтобы порт в .NET-код.Изображение деформации в .NET

Например, вызов тоже: canvas.drawBitmapMesh, есть ли какой-нибудь .NET-коллега для этого? Матричные классы в .NET тоже немного разные, я думаю, но я могу понять, что думаю. Любые советы по оказанию помощи в преобразовании/переносе кода ниже на .NET приветствуются.

public class BitmapMesh extends GraphicsActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new SampleView(this)); 
    } 

    private static class SampleView extends View { 
     private static final int WIDTH = 20; 
     private static final int HEIGHT = 20; 
     private static final int COUNT = (WIDTH + 1) * (HEIGHT + 1); 

     private final Bitmap mBitmap; 
     private final float[] mVerts = new float[COUNT*2]; 
     private final float[] mOrig = new float[COUNT*2]; 

     private final Matrix mMatrix = new Matrix(); 
     private final Matrix mInverse = new Matrix(); 

     private static void setXY(float[] array, int index, float x, float y) { 
      array[index*2 + 0] = x; 
      array[index*2 + 1] = y; 
     } 

     public SampleView(Context context) { 
      super(context); 
      setFocusable(true); 

      mBitmap = BitmapFactory.decodeResource(getResources(), 
                R.drawable.beach); 

      float w = mBitmap.getWidth(); 
      float h = mBitmap.getHeight(); 
      // construct our mesh 
      int index = 0; 
      for (int y = 0; y <= HEIGHT; y++) { 
       float fy = h * y/HEIGHT; 
       for (int x = 0; x <= WIDTH; x++) { 
        float fx = w * x/WIDTH;      
        setXY(mVerts, index, fx, fy); 
        setXY(mOrig, index, fx, fy); 
        index += 1; 
       } 
      } 

      mMatrix.setTranslate(10, 10); 
      mMatrix.invert(mInverse); 
     } 

     @Override protected void onDraw(Canvas canvas) { 
      canvas.drawColor(0xFFCCCCCC); 

      canvas.concat(mMatrix); 
      canvas.drawBitmapMesh(mBitmap, WIDTH, HEIGHT, mVerts, 0, 
            null, 0, null); 
     } 

     private void warp(float cx, float cy) { 
      final float K = 10000; 
      float[] src = mOrig; 
      float[] dst = mVerts; 
      for (int i = 0; i < COUNT*2; i += 2) { 
       float x = src[i+0]; 
       float y = src[i+1]; 
       float dx = cx - x; 
       float dy = cy - y; 
       float dd = dx*dx + dy*dy; 
       float d = FloatMath.sqrt(dd); 
       float pull = K/(dd + 0.000001f); 

       pull /= (d + 0.000001f); 
      // android.util.Log.d("skia", "index " + i + " dist=" + d + " pull=" + pull); 

       if (pull >= 1) { 
        dst[i+0] = cx; 
        dst[i+1] = cy; 
       } else { 
        dst[i+0] = x + dx * pull; 
        dst[i+1] = y + dy * pull; 
       } 
      } 
     } 

     private int mLastWarpX = -9999; // don't match a touch coordinate 
     private int mLastWarpY; 

     @Override public boolean onTouchEvent(MotionEvent event) { 
      float[] pt = { event.getX(), event.getY() }; 
      mInverse.mapPoints(pt); 

      int x = (int)pt[0]; 
      int y = (int)pt[1]; 
      if (mLastWarpX != x || mLastWarpY != y) { 
       mLastWarpX = x; 
       mLastWarpY = y; 
       warp(pt[0], pt[1]); 
       invalidate(); 
      } 
      return true; 
     } 
    } 
} 
+1

На самом деле я не уверен, почему у этого вопроса есть все близкие голоса. Вопрос специфичен и показывает предшествующие исследования со стороны ОП. Насколько я понимаю, ответ очень конкретный и относится к одной технологии и платформе. Sheesh. Может кто-то сказать, что полиция? – Ani

ответ

0

Там нет прямого эквивалента в приложениях Windows Store, чтобы иметь возможность рисовать текстурную карту сетки (и представляют собой деформацию изображения и искажение, путь). Вам понадобится use Direct3D, чтобы нарисовать сетку с текстурой на вашей странице.

Если вы не хотите смешивать C++ и C# в своем приложении, у вас есть два варианта.

  1. SharpDX - это привязки .NET к DirectX.
  2. MonoGame - это графический интерфейс, совместимый с XNA, который использует DirectX на WinRT.

Надеюсь, это поможет!

+0

Thx, и есть ли способ, которым я мог бы напрямую манипулировать пикселями? Метод warp уже делает манипуляции в области 20x20. Не могу ли я сделать это в массиве пикселей? Я нашел алгоритм скручивания, который делает деформацию на всем изображении, мне нужно только сделать это на небольшой части изображения, где были сделаны клики x и y. Я не такой математический волшебник :(Может ли это быть достигнуто без использования Matrixes и для рисования сетки с сеткой? – LordrAider

+0

Если вы имеете в виду доступ к пикселям для прямого манипулирования ЦП, см. Мой другой ответ здесь (http: /stackoverflow.com/questions/13938712/how-to-get-rgb-value-of-a-pixel-in-winrt/13939437#13939437). Однако это будет медленным для большого изображения и/или интерактивных манипуляций. пиксельный шейдер для изображения на квадроцикле будет лучше всего (с точки зрения использования времени и мощности). Обратите внимание, что при написании пиксельного шейдера и текстурированной сетки существуют разные плюсы и минусы (я могу уточнить). IMHO, если вы собираетесь заниматься обработкой изображений, лучше понять эту методологию. – Ani

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