【问题标题】:Libgdx crop image to circleLibgdx 将图像裁剪为圆形
【发布时间】:2024-01-15 07:46:01
【问题描述】:

我正在寻找一种方法,将从用户图库中拍摄的照片裁剪为圆形,以便基本上显示为个人资料图片。

我被推荐使用 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;
            }
        });
    }
}

【问题讨论】:

  • 有很多方法可以做到这一点。考虑添加您想要的屏幕截图。
  • @Xoppa 如果您在 Instagram 上看到圆形个人资料图片,那正是我想要的。我添加了一个代码 sn-p 来展示我如何返回字节数据,这可能与我猜的选择方法有关吗?

标签: libgdx crop


【解决方案1】:

我用这个,它可以工作,但是没有插值,这意味着边缘是像素化的。您可以选择实现插值或使用边框!

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

请记住,这一切都将不受管理!为了让生活更轻松,我通常会保存图像并将其作为托管纹理加载。

【讨论】: