2016-01-25 7 views
2

Я ищу способ обрезать фотографию, взятую из галереи пользователей, в круг, чтобы в основном отображаться как изображение профиля.Libgdx обрезать изображение на круг

Мне рекомендовали использовать Masking. Но я не могу понять, как это сделать на самом деле. Их практически нет, кроме как с кодом Android. Но поскольку я собираюсь портировать свою игру в IOS, мне также нужно решение Libgdx.

Так кто-нибудь сделал это раньше и может иметь рабочий пример?

Вот как я принесу изображение:

ublic void invokeGallery() { 
    if (utils != null) { 
     loading = true; 
     utils.pickImage(new utilsInterface.Callback() { 
      @Override 
      public ImageHandler onImagePicked(final InputStream stream) { 
       loading = true; 
       final byte[] data; 
       try { 
        data = StreamUtils.copyStreamToByteArray(stream); 

        Gdx.app.postRunnable(new Runnable() { 
         @Override 
         public void run() { 


          loading = false; 
         } 
        }); 


       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       loading = false; 
       return null; 
      } 
     }); 
    } 
} 
+0

Существует много способов сделать это. Попробуйте добавить скриншот того, что вы хотите, чтобы он выглядел. – Xoppa

+0

Возможный дубликат [libGDX: как обрезать текстуру как круг] (http://stackoverflow.com/questions/34256170/libgdx-how-can-i-crop-texture-as-a-circle) – asherbar

+0

@Xoppa Если вы видели круговые изображения профиля на Instagram, это именно то, как я этого хочу. Я добавил фрагмент кода, чтобы продемонстрировать, как я возвращаю данные байта, может быть актуальным в зависимости от выбранного метода. – Benni

ответ

3

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

public static Pixmap roundPixmap(Pixmap pixmap) 
{ 
    int width = pixmap.getWidth(); 
    int height = pixmap.getHeight(); 
    Pixmap round = new Pixmap(pixmap.getWidth(),pixmap.getHeight(),Pixmap.Format.RGBA8888); 
    if(width != height) 
    { 
     Gdx.app.log("error", "Cannot create round image if width != height"); 
     round.dispose(); 
     return pixmap; 
    } 
    double radius = width/2.0; 
    for(int y=0;y<height;y++) 
    { 
     for(int x=0;x<width;x++) 
     { 
      //check if pixel is outside circle. Set pixel to transparant; 
      double dist_x = (radius - x); 
      double dist_y = radius - y; 
      double dist = Math.sqrt((dist_x*dist_x) + (dist_y*dist_y)); 
      if(dist < radius) 
      { 
       round.drawPixel(x, y,pixmap.getPixel(x, y)); 
      } 
      else 
       round.drawPixel(x, y, 0); 
     } 
    } 
    Gdx.app.log("info", "pixmal rounded!"); 
    return round; 
} 

Имейте в виду, что все это будет неуправляемо! Чтобы облегчить жизнь, я обычно сохраняю изображение и загружаю его как управляемую текстуру.

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