2016-03-10 2 views
2

Я пытаюсь показать округленное изображение, которое я получаю прямо из Интернета. Я использовал приведенный ниже код, чтобы создать круглую маску, получить изображение из Интернета, а затем попытался либо установить маску на изображении, либо на сам ярлык. Ни один из этих подходов не работал. Если я удалю маску, изображение будет отображаться в порядке. Если я сохраню код для установки маски, то все, что я вижу, это пустой белый круг.Codename Одно закругленное изображение из интернет-источника

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

Но, похоже, я не понимаю, почему вызов setMask на этикетке также не работает.

// Create MASK 

    Image maskImage = Image.createImage(w, l); 
    Graphics g = maskImage.getGraphics(); 
    g.setAntiAliased(true); 
    g.setColor(0x000000); 
    g.fillRect(0, 0, w, l); 
    g.setColor(0xffffff); 
    g.fillArc(0, 0, w, l, 0, 360); 
    Object mask = maskImage.createMask(); 



    // GET IMAGE 
    com.cloudinary.Cloudinary cloudinary = new com.cloudinary.Cloudinary(ObjectUtils.asMap(
      "cloud_name", "REMOVED", 
      "api_key", "REMOVED", 
      "api_secret", "REMOVED")); 
    // Disable private CDN URLs as this doesn't seem to work with free accounts 
    cloudinary.config.privateCdn = false; 
    Image placeholder = Image.createImage(150, 150); 
    EncodedImage encImage = EncodedImage.createFromImage(placeholder, false); 
    Image img2 = cloudinary.url() 
      .type("fetch") // Says we are fetching an image 
      .format("jpg") // We want it to be a jpg 
      .transformation(
        new Transformation() 
        .radius("max").width(150).height(150).crop("thumb").gravity("faces").image(encImage, "http://upload.wikimedia.org/wikipedia/commons/4/46/Jennifer_Lawrence_at_the_83rd_Academy_Awards.jpg"); 

    Label label = new Label(img2); 
    label.setMask(mask); // also tried to do img2.applyMask(mask); before passing img2 

ответ

1

API-интерфейс CloudLine возвращает URLImage, который плохо работает с методом Label.setMask(), поскольку технически URL-адрес является анимированным изображением (это изображение-заполнитель до тех пор, пока он не завершит загрузку, а затем «анимирует», чтобы стать целевым изображением).

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

Я добавил два новых метода image(). Один, который принимает параметр ImageAdapter, который можно использовать для нанесения маски на изображение, прежде чем устанавливать его как значок метки. Тогда вы не будете использовать Label.setMask() вообще.

См javadocs for this method here

Другой метод использует новые интерфейсы API загрузки изображений ASync внизу, чтобы загрузить изображение асинхронно. Образ, который вы получаете в обратном вызове, является «реальным» изображением, поэтому вы можете использовать его с маской в ​​обычном режиме.

См javadocs for this method here

Мы смотрим на добавление мягкое предупреждение в Label.setMask() и SetIcon() методы, если вы попытаетесь добавить «анимированный» изображение и маску так, чтобы она более понятна.

+0

Это имеет смысл. У меня создалось впечатление, что это проблема загрузки изображений. Я воспользуюсь вашим предложением. Я думаю, что это правильный путь. Благодаря!! – 3lix

1

Я думаю, что код делает вас установлен на этикетке может конфликтовать с кодом маскирования вы получаете от Cloudinary.

2

Так что я пробовал различные вещи:

1) Удаление маски, которая была установлена ​​через cloudinary - Это не сработало

2) применил маску на заполнителем & кодированного изображения (как ожидается, они не должны влиять на окончательная версия, которая публикуется)

3) Это то, что работает! Я не уверен, если проблема действительно с загрузкой изображение до или после применения маски .. время может сказать по дороге

Label label = new Label(); 
    img2.applyMask(mask); // If you remove this line , the image will no longer be displayed, I will only see a rounded white circle ! I am not sure what this is doing, it might be simply stalling the process until the image is downloaded? or maybe somehow calling repaint or revalidate 
    label.setIcon(img2.applyMask(mask)); 

Вот что работал для меня, если кто-либо другой, имеющих сходные проблемы:

 //CREATE MASK 
    Image maskImage = Image.createImage(w, l); 
    Graphics g = maskImage.getGraphics(); 
    g.setAntiAliased(true); 
    g.setColor(0x000000); 
    g.fillRect(0, 0, w, l); 
    g.setColor(0xffffff); 
    g.fillArc(0, 0, w, l, 0, 360); 
    Object mask = maskImage.createMask(); 

    //CONNECT TO CLOUDINARY 
    com.cloudinary.Cloudinary cloudinary = new com.cloudinary.Cloudinary(ObjectUtils.asMap(
      "cloud_name", "REMOVED", 
      "api_key", "REMOVED", 
      "api_secret", "REMOVED")); 
    // Disable private CDN URLs as this doesn't seem to work with free accounts 
    cloudinary.config.privateCdn = false; 

    //CREATE IMAGE PLACEHOLDERS 
    Image placeholder = Image.createImage(w, l); 
    EncodedImage encImage = EncodedImage.createFromImage(placeholder, false); 

    //DOWNLOAD IMAGE 
    Image img2 = cloudinary.url() 
      .type("fetch") // Says we are fetching an image 
      .format("jpg") // We want it to be a jpg 
      .transformation(
        new Transformation() 
        .crop("thumb").gravity("faces") 
        .image(encImage, url); 


    // Add the image to a label and place it on the form. 
    //GetCircleImage(img2); 
    Label label = new Label(); 
    img2.applyMask(mask); // If you remove this line , the image will no longer be displayed, I will only see a rounded white circle ! I am not sure what this is doing, it might be simply stalling the process until the image is downloaded? or maybe somehow calling repaint or revalidate 
    label.setIcon(img2.applyMask(mask)); 

Шай, я серьезно ценю ваше время! Большое спасибо. Вам придется больше копать в нее, если позже это вызовет другие проблемы, но, похоже, она работает постоянно.

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