【问题标题】:Unity: Reading image pixel color and instantiating object based on thatUnity:读取图像像素颜色并基于此实例化对象
【发布时间】:2017-06-17 22:04:41
【问题描述】:

我需要读取图像像素颜色,图像将只有黑白。因此,如果像素为白色,我想实例化白色立方体,如果像素为黑色,我想实例化黑色立方体。现在这对我来说是全新的,所以我进行了一些挖掘,最终我使用了 system.Drawing 和位图。但是现在我卡住了。我不知道如何检查白色像素

例如

private void Pixelreader()
{
    Bitmap img = new Bitmap(("ImageName.png");
    for (int i = 0; i < img.Width; i++)
    {
        for (int j = 0; j < img.Height; j++)
        {
            System.Drawing.Color pixel = img.GetPixel(i, j);

            if (pixel == *if image is white)
            {
               // instantiate white color.
            }
        }
    }
}

还有其他方法吗?谢谢!

【问题讨论】:

  • 如果你能提供一些视觉资料来更好地解释,那就更好了!
  • 什么视觉效果?我只是在处理空场景和图像。图像不会出现在场景中,我只需要加载图像并读取它的像素。图像将始终为黑色或白色。所以如果像素是黑色的,我想调试黑色,否则调试白色。然后基于此,我会做我想做的。

标签: c# unity3d unity5


【解决方案1】:

如果图像真的只有黑白(即所有像素都等于System.Drawing.Color.BlackSystem.Drawing.Color.White),那么您可以直接比较这些颜色。在您发布的代码中,它将如下所示:

if (pixel == System.Drawing.Color.White)
{
    //instantiate white color.
}

如果图像是 Unity 资产的一部分,更好的方法是使用资源来读取它。将图像放入 Assets/Resources 文件夹;那么你可以使用下面的代码:

Texture2D image = (Texture2D)Resources.Load("ImageName.png");

如果图像是全黑或全白,则无需循环 - 只需检查一个像素:

if(image.GetPixel(0,0) == Color.White)
{
    //Instantiate white cube
}
else
{
    //Instantiate black cube
}

【讨论】:

  • 是的,我试过这个,但我不断收到错误。它说:ArgumentException:找到空引用或无效值[GDI+状态:无效参数]
  • 这就是我加载图像的方式:Bitmap myBitmap = new Bitmap("Earth.png");
  • @Nanopili,您能否验证您的位图是否已找到并正确加载?请记住,您发布的代码试图从磁盘加载图像(而不是从 Unity 项目中的资产)
  • 我的图像也为空,所以路径一定是错误的......:NullReferenceException:对象引用未设置为对象的实例
  • 让我测试一下,但现在你删除了所有系统。你只使用Unity的绘图和位图吗?而且,图像将永远是黑白的。
【解决方案2】:

您实际上可以将图像作为资源加载到 Texture2D 中,然后使用 UnityEngine.Texture2DUnityEngine.Color.GrayScale 检查您得到的颜色是否足够接近白色。

【讨论】:

    【解决方案3】:

    听起来你有点过火了,而是可以使用 Unity 中已经内置的功能。尝试查看在光线投射期间获取像素颜色。

    if (Physics.Raycast (ray, hit)) {
         var TextureMap: Texture2D = hit.transform.renderer.material.mainTexture;
         var pixelUV = hit.textureCoord;
             pixelUV.x *= TextureMap.width;
             pixelUV.y *= TextureMap.height;
    
             print ( "x=" + pixelUV.x + ",y=" + pixelUV.y + " " + TextureMap.GetPixel (pixelUV.x,pixelUV.y) );
    

    Taken from here

    【讨论】:

    • 我真的不明白?这将如何运作?光线投射会从我的相机投射到图像上吗?但我不会在场景中有图像,我只想读取它并获取它的像素..
    • 那么我想我错过了这个练习的全部要点?图片在哪里?为什么要从中读取?
    • 图片在 Unity assets 文件夹中,我只需要访问它并阅读它。图像总是只有黑白的,所以在白色像素上我想要白色立方体,在黑色像素上我想要黑色立方体就是这样..
    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 2020-05-19
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    相关资源
    最近更新 更多