【问题标题】:8bpp Bitmap format on the Compact FrameworkCompact Framework 上的 8bpp 位图格式
【发布时间】:2009-09-24 23:16:32
【问题描述】:

我在玩康威的生命游戏 - http://en.wikipedia.org/wiki/Conway's_Game_of_Life

我开始为 winforms 编码算法,现在想将我的工作移植到 windows mobile 6.1(紧凑框架)上。我看到了 Jon Skeet 的一篇文章,他在其中比较了几种不同的算法来计算游戏中的下一代。他使用一个字节数组来存储单元状态(活动或死亡),然后将该数组复制到 8bpp 位图。对于每一代,他计算出每个字节的状态,然后将数组复制到位图,然后将该位图绘制到图片框。

        void CreateInitialImage()
    {
        bitmap = new Bitmap(Width, Height, PixelFormat.Format8bppIndexed);
        ColorPalette palette = bitmap.Palette;
        palette.Entries[0] = Color.Black;
        palette.Entries[1] = Color.White;
        bitmap.Palette = palette;
    }

    public Image Render()
    {
        Rectangle rect = new Rectangle(0, 0, Width, Height);
        BitmapData bmpData = bitmap.LockBits(rect, ImageLockMode.ReadWrite, bitmap.PixelFormat);
        Marshal.Copy(Data, 0, bmpData.Scan0, Data.Length);
        bitmap.UnlockBits(bmpData);
        return bitmap;
    }

他上面的代码非常简单,渲染速度非常快。 Jon 正在使用 Windows 窗体,但现在我想将我自己的版本移植到 Windows Mobile 6.1(紧凑框架)上,但是 . . . .没有办法在cf中将位图格式化为8bpp。

谁能建议一种将字节数组渲染到 CF 中可绘制图像的方法。这个数组是在代码中动态创建的(它不是从磁盘上的图像文件加载的)。我基本上需要存储一个由字节表示的单元格数组,它们要么是活着的,要么是死的,然后我需要将该数组绘制为图像。游戏在 CF 上特别慢,所以我需要实现巧妙的优化算法,但还需要尽可能快地渲染,如果只有在紧凑框架上可用,上述解决方案将非常完美。

非常感谢您的帮助

有什么建议吗?

【问题讨论】:

    标签: c# compact-framework


    【解决方案1】:

    您可以查看 GDI+ for CF。它基本上是在 WinCE 中实现的大多数 GDI 的包装器。这是源代码和文章的链接:http://community.opennetcf.com/articles/cf/archive/2007/10/31/using-gdi-on-windows-mobile.aspx

    我认为 ImagingFactoryClass.CreateBitmapFromBuffer() 看起来是个不错的起点。

    【讨论】:

    • 我已经下载了,但我似乎找不到你指的“ImageFactory”类
    • 啊,搞定了,不得不下载OpenNetCF智能设备框架。我认为这是一个死胡同,因为他们使用相同的 System.Drawing.Imaging.PixelFormat 枚举,所以我仍然无法通过他们的框架获得 8bpp 图像。
    【解决方案2】:

    好的,这个怎么样:

    • 使用 Bitmap.Save() 方法保存到 MemoryStream 而不是文件;
    • 当您保存到 MemoryStream 时,您可以将 ImageFormat 命名为“GIF”(这相当于 .Net 中的 8bpp,据此:http://support.microsoft.com/kb/318343)
    • 使用 MemoryStream.Write() 更改图像中所需的任何数据,或者使用 MemoryStream.ToArray() 复制数据(如果效果更好)。

    更改 MemoryStream 后,您可能必须将其复制回位图,或制作新的位图。如果您确实制作了新的位图,请务必 Dispose() 旧的位图,以避免内存泄漏。

    【讨论】:

      【解决方案3】:

      嗨,Rocjoe,再次感谢您的帮助,我尝试了以下方法

              Image bmp = new Bitmap(10, 10);
              byte[] array = ImageToByteArray(bmp);
      
      
              public byte[] ImageToByteArray(Image img)
          {
              MemoryStream ms = new MemoryStream();
              img.Save(ms, System.Drawing.Imaging.ImageFormat.Gif );
              return ms.ToArray();
          }
      

      返回的数组中有超过 870 个字节,它似乎包含各种标题信息、填充和你有什么。所以再次它不起作用......

      【讨论】:

        猜你喜欢
        • 2013-07-24
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        • 2010-09-26
        • 1970-01-01
        • 2012-07-12
        • 2010-10-09
        • 1970-01-01
        相关资源
        最近更新 更多