Codename One округленное изображение из интернет-источника

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

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

Но я не понимаю, зачем звонить 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 

3 ответа

Решение

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

Я только что выпустил новую версию облачной библиотеки cn1lib, которая дает вам несколько вариантов для решения этой проблемы.

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

Смотрите javadocs для этого метода здесь

Другой метод использует новые API-интерфейсы загрузки изображений Async для асинхронной загрузки изображения. Изображение, которое вы получаете при обратном вызове, является "реальным" изображением, поэтому вы можете использовать его с маской как обычно.

Смотрите javadocs для этого метода здесь

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

Поэтому я пробовал разные вещи:

1) Снятие маски, которая была установлена ​​через облачный сервис - это не сработало

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));

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

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

Другие вопросы по тегам