赞
踩
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using Color = UnityEngine.Color;
public class Demo_texture : MonoBehaviour
{
//计算鼠标点击位置 对应的像素位置,一个是image的左下角,一个是图片的右上角
public Transform textureOrigin;
public Transform textureUPEnd;
//存储点击的图片的texture2D getpixel() 使用
private Texture2D clickTexture2D;
//存储鼠标点击位置的像素值
private Color testColor;
//存储计算出来的像素点的位置
private Vector2 colorPos;
//存储图片定位点的屏幕坐标
private Vector3 textureOriginScreenPosition;
private Vector3 textureEndUPScreenPosition;
//图片 (Read/Write Enabled:读/写 启用)
public Image image;
//点击区域的所变的颜色
public Color color = Color.magenta;
public Stack stackX = new Stack();
public Stack stackY = new Stack();
public Color getColor(int x, int y) { //返回坐标 (x,y) 处的像素颜色 return clickTexture2D.GetPixel(x, y); } public void setColor(int x, int y, Color c) { //设置坐标 (x,y) 处的像素颜色 clickTexture2D.SetPixel(x, y, c); } private void Start() { //将 position 从世界空间变换为屏幕空间。 textureOriginScreenPosition = Camera.main.WorldToScreenPoint(textureOrigin.position); textureEndUPScreenPosition = Camera.main.WorldToScreenPoint(textureUPEnd.position); } private void Update() { //返回从摄像机通过屏幕点的光线。 Ray r = Camera.main.ScreenPointToRay(Input.mousePosition); //用于从射线投射获取信息 RaycastHit hit; if (Input.GetMouseButtonDown(0)) { //发射射线 if (Physics.Raycast(r, out hit)) { HitColorChooseImage(hit); } } } private void HitColorChooseImage(RaycastHit hit) { //如果射线命中 if (hit.collider.name == "Image") { //获取到纹理引用 clickTexture2D = hit.collider.gameObject.GetComponent<Image>().sprite.texture; CaculateVector2(); } } private void CaculateVector2() { //鼠标当前的像素坐标位置 colorPos.x = (Input.mousePosition.x - textureOriginScreenPosition.x) / (textureEndUPScreenPosition.x - textureOriginScreenPosition.x) * clickTexture2D.width; colorPos.y = (Input.mousePosition.y - textureOriginScreenPosition.y) / (textureEndUPScreenPosition.y - textureOriginScreenPosition.y) * clickTexture2D.height; Debug.Log(colorPos.x+"."+colorPos.y); //识别底层颜色 // if (!(getColor((int)colorPos.x, (int)colorPos.y) == Color.white)) // { // Debug.Log(colorPos.x+","+colorPos.y); // return; // } // stackX.Clear(); stackY.Clear(); int y1; bool spanLeft, spanRight; stackX.Push((int)colorPos.x); stackY.Push((int)colorPos.y); while (stackX.Count>0 && stackY.Count>0) { colorPos.x = stackX.Pop(); colorPos.y = stackY.Pop(); y1 = (int)colorPos.y; while (y1 >= 0 && getColor((int)colorPos.x, y1) == Color.white) { y1--; } y1++; spanLeft = false; spanRight = false; while (y1 < clickTexture2D.height && getColor((int) colorPos.x, y1) == Color.white) { setColor((int)colorPos.x, y1, color); if (!spanLeft && colorPos.x > 0 && getColor((int)colorPos.x - 1, y1) == Color.white) { stackX.Push((int)colorPos.x - 1); stackY.Push(y1); spanLeft = true; } else if (spanLeft && colorPos.x > 0 && getColor((int)colorPos.x - 1, y1) != Color.white) { spanLeft = false; } if (!spanRight && colorPos.x < clickTexture2D.width - 1 && getColor((int)colorPos.x + 1, y1) == Color.white) { stackX.Push((int)colorPos.x + 1); stackY.Push(y1); spanRight = true; } else if (spanRight && colorPos.x < clickTexture2D.width - 1 && getColor((int)colorPos.x + 1, y1) != Color.white) { spanRight = false; } y1++; } } //实际应用任何先前的 SetPixel 和 SetPixels 更改 clickTexture2D.Apply(); }
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。