Compact Framework上的8bpp位图格式

时间:2009-09-24 23:16:32

标签: c# compact-framework

我正在搞乱康威的生命游戏 - 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 Forms,但现在我想将自己的版本移植到Windows Mobile 6.1(Compact Framework)上。 。 。 。在cf。

中无法将位图格式化为8bpp

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

非常感谢您的帮助

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

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

我认为ImagingFactoryClass.CreateBitmapFromBuffer()看起来是个好地方。

答案 1 :(得分:0)

好的,这个怎么样:

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

更改MemoryStream后,您可能需要将其复制回Bitmap,或者创建一个新的Bitmap。如果您确实创建了一个新的Bitmap,请确保Dispose()旧的Bitmap,以避免内存泄漏。

答案 2 :(得分:0)

您好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个字节,它似乎包含各种标题信息,填充和你有什么。所以它再次起作用......