unity 点击获取屏幕中图片像素的颜色

 

 /// <summary>
    /// 获取屏幕点击贴图像素位置
    /// 点击屏幕  点击到图片,计算图片的像素坐标(图片的屏幕像素范围(宽高),屏幕坐标到图片像素坐标的转换) 获取颜色
    /// </summary>
    /// <param name="screenPosition">屏幕坐标</param>
    /// <param name="rectT">图片位置</param>
    /// <param name="texture">Image 中的贴图</param>
    /// <returns>贴图像素 uv 值</returns>
    private Vector2 ReadScreenPositionTextureColor(Vector2 screenPosition, RectTransform rectT, Texture2D texture)
    {
        float width = rectT.rect.width * rectT.localScale.x;
        float heigth = rectT.rect.height * rectT.localScale.y;

        //UI空间坐标到屏幕坐标的转换
        //图片范围
        Vector2 v0 = new Vector2(rectT.localPosition.x + (Screen.width - width) / 2
            , rectT.localPosition.y + (Screen.height - heigth) / 2);
        Vector2 v1 = new Vector2(rectT.localPosition.x + (Screen.width + width) / 2
            , rectT.localPosition.y + (Screen.height + heigth) / 2);
        if (screenPosition.x < v1.x && screenPosition.x > v0.x && screenPosition.y < v1.y && screenPosition.y > v0.y)
        {
            //点击到图片区域
            float x = (screenPosition.x - v0.x) / width * texture.width;
            float y = (screenPosition.y - v0.y) / heigth * texture.height;
            return new Vector2(x, y);
        }
        else
        {
            Debug.Log("点击到图片之外");
            return new Vector2(0, 0);
        }
    }

使用:

public Texture2D main_tex;
public RawImage image;

void Start()
    {
        image.texture = main_tex;

    }  

private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Vector2 vOut = ReadScreenPositionTextureColor(Input.mousePosition, image.GetComponent<RectTransform>(), main_tex);
            Color colorOut = rgb_tex.GetPixel((int)vOut.x, (int)vOut.y);
            Debug.Log(colorOut);
        }
    }

更新:  pc端全屏时发现,鼠标点击的坐标错误,导致计算的贴图uv值错误。 原因: Canvas 分辨率与电脑分辨率不一致。

所以,动态修改Canvas设置为屏幕分辨率:

更新: 自动转换屏幕分辨率 相对于 CanvasScaler 分辨率的新坐标,如果屏幕分辨率与CanvasScaler 设置值不一致,使用这个。

    public CanvasScaler scaler;

    private Vector2 ReadScreenPositionTextureColor(Vector2 InputPosition, RectTransform rectT, Texture2D texture)
    {
        float width = rectT.rect.width * rectT.localScale.x;
        float heigth = rectT.rect.height * rectT.localScale.y;

        //屏幕分辨率到自定义的 CanvasScaler 分辨率的坐标转换
        Vector2 screenPosition = new Vector2(InputPosition.x / Screen.width * scaler.referenceResolution.x,
                                             InputPosition.y / Screen.height * scaler.referenceResolution.y);
       //UI空间坐标到屏幕坐标的转换
       //图片范围(四个角坐标)
        Vector2 v0 = new Vector2(rectT.localPosition.x + (scaler.referenceResolution.x - width) / 2
            , rectT.localPosition.y + (scaler.referenceResolution.y - heigth) / 2);
        Vector2 v1 = new Vector2(rectT.localPosition.x + (scaler.referenceResolution.x + width) / 2
            , rectT.localPosition.y + (scaler.referenceResolution.y + heigth) / 2);

        Debug.Log($"v0:{v0} v1:{v1} screenPosition:{screenPosition}");

        if (screenPosition.x < v1.x && screenPosition.x > v0.x && screenPosition.y < v1.y && screenPosition.y > v0.y)
        {
            //点击到图片区域
            float x = (screenPosition.x - v0.x) / width * texture.width;
            float y = (screenPosition.y - v0.y) / heigth * texture.height;
            return new Vector2(x, y);
        }
        else
        {
            Debug.Log("点击到图片之外");
            return new Vector2(0, 0);
        }
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值