在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文件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)