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.