【问题标题】:C# image pixel format of alpha only仅 alpha 的 C# 图像像素格式
【发布时间】:2014-02-11 07:21:05
【问题描述】:

System.Drawing.Imaging.PixelFormat.Alpha 究竟代表什么?看起来这类似于已折旧的 OpenGL.GL_APHA。

我正在尝试转换如下所示的一行 Java 代码:

  TextureData textureData = new TextureData(GL.GL_ALPHA, size, size, 0, GL.GL_ALPHA,
            GL.GL_UNSIGNED_BYTE, false, false, false, textureBytes.rewind(), null);

到它的 C# 表示。

我已经定义了一个类来封装像素格式,让我可以在 DirectX 和 OpenGL 之间来回切换,如下所示:

  public class PixelFormat
    {
        public static readonly PixelFormat R8 = new PixelFormat(8, 0, DataType.UnsignedByte);
        public static readonly PixelFormat R5G5B5A1 = new PixelFormat(5, 1, DataType.UnsignedShort);

        public bool IsColorPremultipliedByAlpha { get; private set; }
        public bool IsCompressed { get; private set; }
        public int Format { get; set; }
        public double Gamma { get; private set; }
        public int BitsPerPixel { get { return NumberOfRedBits + NumberOfGreenBits + NumberOfBlueBits; }}

        public ushort NumberOfRedBits { get; private set; }
        public ushort NumberOfGreenBits { get; private set; }      
        public ushort NumberOfBlueBits { get; private set; }
        public ushort NumberOfAlphaBits { get; private set; }
        public int IndexIntoColorPallete { get; set; }
        public bool IsIndexed { get; set; }
        public DataType DataType { get; set; }
        public IndexedColorFormat IndexedColorFormat { get; set; }

        public OpenglPixelAttributes GetOpenglConstant()
        {
            return null;
        }      
    }    

我想使用我的 PixelFormat 类的实例来表示 System.Drawing.Imaging.PixelFormat.Alpha 或其 OpenGL 表亲。

有什么想法吗?

【问题讨论】:

    标签: c# opengl directx alpha-transparency image-formats


    【解决方案1】:

    GL_ALPHA 实际上只是归结为单组件纹理,其中单个组件被认为是 Alpha 通道。如果您以非弃用的内部格式(例如 GL_R8)存储图像数据,您可以编写自己的 Get 方法来转换为 RGBA(假设您确实需要它)。

    问题是,我现在在您提议的 PixelFormat 类中看不到任何实际公开数据的内部表示的地方。这段代码最接近缺少GL_ALPHA 的地方在于能够查询每个组件的存储。


    要回答您的原始问题,GL_ALPHA 表示:

    vec4 (0.0, 0.0, 0.0, alpha)
    

    如果您想使用GL_R8 图像格式替换GL_ALPHA,您可以在着色器中执行此操作:

    vec4 (0.0, 0.0, 0.0, red)
    

    如果您需要从 Alpha 像素格式返回 RGBA 图像,您可以轻松地在 CPU 端执行相同的操作。否则,只返回一个像素数组,其中RedBits = 0GreenBits = 0BlueBits = 0AlphaBits = ...。这相当于一个 alpha 值数组,虽然 GL 会认为这些像素中的每一个都是红色分量,但这在这里几乎无关紧要。

    TL;DR:现代 GL 将单分量图像格式解释为红色这一事实只会在少数地方发挥作用。由于现在有足够多的管道是可编程的,因此让 GL 专门处理 alpha 图像格式是没有意义的。亮度也是如此,所有这些都可以通过着色器中的混合来完成。

    【讨论】:

    • 感谢您的精心回复。问题是这个 JAVA SDK,worldwind.arc.nasa.gov/java,我正在移植目前不使用着色器。另外,您如何建议我构造 PixelFormat 以公开数据的内部表示?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多