日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# Image 、 byte[] 、Bitmap之间的转化

發布時間:2025/3/15 C# 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# Image 、 byte[] 、Bitmap之间的转化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Byte[] 轉 System.Drawing.Bitmap

public static Bitmap CreateBitmap(byte[] originalImageData, int originalWidth, int originalHeight)
{

//指定8位格式,即256色
Bitmap resultBitmap = new Bitmap(originalWidth, originalHeight, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
//將該位圖存入內存中
MemoryStream curImageStream = new MemoryStream();
resultBitmap.Save(curImageStream, System.Drawing.Imaging.ImageFormat.Bmp);
curImageStream.Flush();
//由于位圖數據需要DWORD對齊(4byte倍數),計算需要補位的個數
int curPadNum = ((originalWidth * 8 + 31) / 32 * 4) - originalWidth;
//最終生成的位圖數據大小
int bitmapDataSize = ((originalWidth * 8 + 31) / 32 * 4) * originalHeight;
//數據部分相對文件開始偏移,具體可以參考位圖文件格式
int dataOffset = ReadData(curImageStream, 10, 4);
//改變調色板,因為默認的調色板是32位彩色的,需要修改為256色的調色板
int paletteStart = 54;
int paletteEnd = dataOffset;
int color = 0;
for (int i = paletteStart; i < paletteEnd; i += 4)
{

byte[] tempColor = new byte[4];
tempColor[0] = (byte)color;
tempColor[1] = (byte)color;
tempColor[2] = (byte)color;
tempColor[3] = (byte)0;
color++;
curImageStream.Position = i;
curImageStream.Write(tempColor, 0, 4);

}
//最終生成的位圖數據,以及大小,高度沒有變,寬度需要調整
byte[] destImageData = new byte[bitmapDataSize];
int destWidth = originalWidth + curPadNum;
//生成最終的位圖數據,注意的是,位圖數據 從左到右,從下到上,所以需要顛倒
for (int originalRowIndex = originalHeight - 1; originalRowIndex >= 0; originalRowIndex--)
{
  int destRowIndex = originalHeight - originalRowIndex - 1;
  for (int dataIndex = 0; dataIndex < originalWidth; dataIndex++)
    {
      //同時還要注意,新的位圖數據的寬度已經變化destWidth,否則會產生錯位
      destImageData[destRowIndex * destWidth + dataIndex] = originalImageData[originalRowIndex * originalWidth + dataIndex];
    ??}

}

//將流的Position移到數據段
curImageStream.Position = dataOffset;
//將新位圖數據寫入內存中
curImageStream.Write(destImageData, 0, bitmapDataSize);
curImageStream.Flush();
//將內存中的位圖寫入Bitmap對象
resultBitmap = new Bitmap(curImageStream);
return resultBitmap;

}


public static int ReadData(MemoryStream curStream, int startPosition, int length)
{

int result = -1;
byte[] tempData = new byte[length];
curStream.Position = startPosition;
curStream.Read(tempData, 0, length);
result = BitConverter.ToInt32(tempData, 0);
return result;

}

  

  

轉載于:https://www.cnblogs.com/alsofly/p/3373833.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的C# Image 、 byte[] 、Bitmap之间的转化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。