如何从C#中的byte []创建一个bmp文件

如何从C#中的byte []创建一个bmp文件,第1张

概述我在TCP Client中收到一个byte []数组.该数组包含一个24位RGB位图文件.如何使用给定的Width,Height和数据创建该位图文件? 在C我用这个 int WriteBitmapFile(const char *filename, int width, int height, unsigned char *imageData){FILE *filePt 我在TCP ClIEnt中收到一个byte []数组.该数组包含一个24位RGB位图文件.如何使用给定的WIDth,Height和数据创建该位图文件?

在C我用这个

int WriteBitmapfile(const char *filename,int wIDth,int height,unsigned char *imageData){file             *filePtr;        // file pointerBITMAPfileheader bitmapfileheader;    // bitmap file headerBITMAPINFOheader bitmAPInfoheader;    // bitmap info headerDWORD                 imageIDx;    // used for swapPing RGB->BGRunsigned char     tempRGB;            // used for swapPing// open file for writing binary modefilePtr = fopen(filename,"wb");if (!filePtr)    return 0;// define the bitmap file headerbitmapfileheader.bfSize = sizeof(BITMAPfileheader);bitmapfileheader.bfType = 0x4D42;bitmapfileheader.bfReserved1 = 0;bitmapfileheader.bfReserved2 = 0;bitmapfileheader.bfOffBits = sizeof(BITMAPfileheader) + sizeof(BITMAPINFOheader);// define the bitmap information headerbitmAPInfoheader.biSize = sizeof(BITMAPINFOheader);bitmAPInfoheader.biPlanes = 1;bitmAPInfoheader.biBitCount = 32;                        // 24-bitbitmAPInfoheader.biCompression = BI_RGB;                // no compressionbitmAPInfoheader.biSizeImage = wIDth * abs(height) * 4;    // wIDth * height * (RGB bytes)bitmAPInfoheader.biXPelsPerMeter = 0;bitmAPInfoheader.biYPelsPerMeter = 0;bitmAPInfoheader.biClrUsed = 0;bitmAPInfoheader.biClrimportant = 0;bitmAPInfoheader.biWIDth = wIDth;                        // bitmap wIDthbitmAPInfoheader.biHeight = height;                    // bitmap height// switch the image data from RGB to BGRfor(imageIDx = 0; imageIDx < bitmAPInfoheader.biSizeImage; imageIDx+=4){    tempRGB = imageData[imageIDx];    imageData[imageIDx] = imageData[imageIDx + 2];    imageData[imageIDx + 2] = tempRGB;}// write the bitmap file headerfwrite(&bitmapfileheader,1,sizeof(BITMAPfileheader),filePtr);// write the bitmap info headerfwrite(&bitmAPInfoheader,sizeof(BITMAPINFOheader),filePtr);// write the image datafwrite(imageData,bitmAPInfoheader.biSizeImage,filePtr);// close our filefclose(filePtr);// Successreturn 1;}

在C#中怎么做?

解决方法 如果数组实际上包含一个位图文件,那么你可以将这些字节保存为一个文件:
file.WriteallBytes(filename,imageData);

如果数组仅包含原始像素数据,则可以使用数据创建Bitmap对象:

unsafe {   fixed (byte* ptr = imageData) {      using (Bitmap image = new Bitmap(wIDth,height,strIDe,PixelFormat.Format24bppRgb,new IntPtr(ptr))) {         image.Save(filename);      }   }}

步幅值是扫描线之间的字节数.如果扫描线之间没有填充,则对于24bpp格式,它的宽度为* 3.

该方法使用数组中的数据,而不会在内存中创建整个映像的另一个副本(这就是为什么需要strIDe值).

如果位图数据被颠倒存储在数组中,则步幅值应为负值,指针应为存储器中最后一行扫描行的开始位置(ptr strIDe *(height-1))).

总结

以上是内存溢出为你收集整理的如何从C#中的byte []创建一个bmp文件全部内容,希望文章能够帮你解决如何从C#中的byte []创建一个bmp文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241594.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存