繁体   English   中英

Compact Framework上的8bpp位图格式

[英]8bpp Bitmap format on the Compact Framework

我在搞弄康威的人生游戏-http: //en.wikipedia.org/wiki/康威的s_Game_of_Life

我开始为winforms编码algorithmns,现在想将我的工作移植到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上,游戏特别慢,因此我需要实现聪明的优化算法,但还需要尽可能快地渲染,并且如果紧凑型框架上只有上述解决方案,那将是非常完美的选择。

非常感谢您的帮助

有什么建议么?

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

我认为ImagingFactoryClass.CreateBitmapFromBuffer()似乎是一个不错的起点。

好吧,这呢:

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

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

您好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多个字节,它似乎包含了各种标题信息,填充以及您所拥有的内容。 所以再次它不起作用...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM