2

インターネットから直接取得した丸みを帯びた画像を表示しようとしています。以下のコードを使用して丸いマスクを作成し、インターネットから画像を取得してから、画像またはラベル自体にマスクを設定しようとしました。これらのアプローチはどれも機能しませんでした。マスクを外すと、画像は正常に表示されます。マスクを設定するコードを保持すると、空の白い円が表示されます。

画像自体にマスクを適用すると、マスクが適用された時点で画像がダウンロードされていないため、有効にならない可能性があるという考えがあります。

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 
4

3 に答える 3

2

だから私はさまざまなことを試しました:

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

シャイ、お時間いただきありがとうございました!! どうもありがとうございました。後で他の問題が発生した場合は、さらに掘り下げる必要がありますが、今のところ一貫して機能しているようです.

于 2016-03-11T05:25:04.980 に答える
1

Cloudinary API は、Label.setMask() メソッドでうまく機能しない URLImage を返します。これは、技術的には、URLImage がアニメーション化されたイメージであるためです (読み込みが完了するまではプレースホルダー イメージであり、その後「アニメーション化」してターゲットになります)。画像)。

これを回避するためのいくつかのオプションを提供する cloudinary cn1lib の新しいバージョンをリリースしました。

2 つの新しいimage()メソッドを追加しました。ImageAdapterラベルのアイコンとして設定する前に、画像自体にマスクを適用するために使用できるパラメーターを受け取るもの。次に、 Label.setMask() をまったく使用しません。

このメソッドの Javadoc を参照してください。

もう 1 つの方法は、下にある新しい非同期画像読み込み API を使用して、画像を非同期的に読み込みます。コールバックで受け取る画像は「実際の」画像なので、通常はマスクで使用できます。

このメソッドの Javadoc を参照してください。

「アニメーション化された」画像を追加してより明確にするためにマスクしようとした場合、Label.setMask() および setIcon() メソッドにソフト警告を追加することを検討しています。

于 2016-03-11T17:10:26.827 に答える
1

ラベルに設定した作成コードが、Cloudinary から取得したマスキング コードと競合している可能性があると思います。

于 2016-03-11T04:25:21.063 に答える