在 AS3 图形 API 上应用 16 位颜色

Posted

技术标签:

【中文标题】在 AS3 图形 API 上应用 16 位颜色【英文标题】:Applying 16 bit colour on AS3 Graphics API 【发布时间】:2013-09-27 10:25:28 【问题描述】:

我需要编写一个使用 16 位颜色值绘制像素的函数。我目前正在使用以下代码来绘制每个像素。

var pixel:Shape = new Shape();
pixel.graphics.beginFill(//16bit colour value);
pixel.graphics.drawRect (xVal, yVal, pixelWidth, pixelHeight);

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Graphics.html

我需要将 16 位颜色值(例如 111110000000000b,红色)应用到上述图形 API 函数,但似乎该函数需要 32 位 RGB 颜色值。我还研究了其他可能的方法,例如 ...

BitmapData()

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#BitmapData()

但它也需要 32 位 RGB 值。 AS3 中是否有处理此问题的 API?或者有没有一个看似可以将 16 位颜色值转换为 32 位颜色值的公式?

【问题讨论】:

你能解释一下为什么你对这个问题投了反对票吗? 我认为这篇文章会有所帮助***.com/questions/8579353/… 我还没有尝试过 16 位到 32 位的转换实现,但感谢您的回复。 【参考方案1】:

c++ 代码从 Convert 16bit colour to 32bit 到 AS3 的端口:

public static function rgb16ToRgb32(a:uint):uint

    /* 1. Extract the red, green and blue values */

    /* from rrrr rggg gggb bbbb */
    var r:uint = (a & 0xF800) >> 11;
    var g:uint = (a & 0x07E0) >> 5;
    var b:uint = (a & 0x001F);

    /* 2. Convert them to 0-255 range:
    There is more than one way. You can just shift them left:
    to 00000000 rrrrr000 gggggg00 bbbbb000
    r <<= 3;
    g <<= 2;
    b <<= 3;
    But that means your image will be slightly dark and
    off-colour as white 0xFFFF will convert to F8,FC,F8
    So instead you can scale by multiply and divide: */

    r = r * 255 / 31;
    g = g * 255 / 63;
    b = b * 255 / 31;
    /* This ensures 31/31 converts to 255/255 */

    /* 3. Construct your 32-bit format (this is 0RGB): */
    return (r << 16) | (g << 8) | b;

    /* Or for BGR0:
    return (r << 8) | (g << 16) | (b << 24);
    */

测试:

    var reb16b:String = "1111100000000000b";
    var red16:uint = parseInt(reb16b, 2);
    trace("red16 = "+reb16b+ " [0x"+red16.toString(16).toUpperCase()+"]");

    var red32:uint = rgb16ToRgb32(red16);
    trace("red32 = 0x"+red32.toString(16).toUpperCase());

输出:

    red16 = 1111100000000000b [0xF800]
    red32 = 0xFF0000

所以你可以用代码绘制16位红色rec:

    var pixel:Shape = new Shape();
    pixel.graphics.beginFill(rgb16ToRgb32(0xF800));
    pixel.graphics.drawRect (xVal, yVal, pixelWidth, pixelHeight);

【讨论】:

以上是关于在 AS3 图形 API 上应用 16 位颜色的主要内容,如果未能解决你的问题,请参考以下文章

AS3使用位移位将RGB值转换为颜色

ActionScript 3 AS3使用按位移位将RGB值转换为颜色

16 位桌面颜色深度中的 BitBlt + UpdateLayeredWindow 和 CreateDIBSection

如何通过 iOS 中的图形 API 在 Facebook 页面上作为 Page Post 从应用发布?

如何在 as3 中获得 GlowFilter 颜色?

AS3/Spritesheets/Starling 的 Flash 性能