c# 读取二进制文件画灰度图

c# 读取二进制文件画灰度图,第1张

搜到了下面的程序段,希望能行

/// <summary>

/// 使用byte[]数据,生成256色灰度 BMP 位图

/// </summary>

/// <param name="originalImageData"></param>

/// <param name="originalWidth"></param>

/// <param name="originalHeight"></param>

/// <returns></returns>

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 = paletteStarti <paletteEndi += 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 - 1originalRowIndex >= 0originalRowIndex--)

{

int destRowIndex = originalHeight - originalRowIndex - 1

for (int dataIndex = 0dataIndex <originalWidthdataIndex++)

{

//同时还要注意,新的位图数据的宽度已经变化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

}

/// <summary>

/// 从内存流中指定位置,读取数据

/// </summary>

/// <param name="curStream"></param>

/// <param name="startPosition"></param>

/// <param name="length"></param>

/// <returns></returns>

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

}

/// <summary>

/// 向内存流中指定位置,写入数据

/// </summary>

/// <param name="curStream"></param>

/// <param name="startPosition"></param>

/// <param name="length"></param>

/// <param name="value"></param>

public static void WriteData(MemoryStream curStream, int startPosition, int length, int value)

{

curStream.Position = startPosition

curStream.Write(BitConverter.GetBytes(value), 0, length)

}

指定到 jsp ,那个jsp 里肯定有默认的请求发送。这种写法不是很普遍。 最普遍的是URL 直接写入要访问的服务器地址以及具体相对路径。

这个要后台是GET 还是 POST ,查询一般是 GET。

form.getForm().submit({

url:.......,

waitMsg:'加载中....',

params:{

method:'login'

},

success:function(form, action){

//如果返回true则

Ext.MessageBox.alert("info","登录成功!")

},

failure : function(form, action) {

Ext.MessageBox.alert("info","登录失败!")

}

})

//形式差不多就是这样的。

Ext.create('Ext.grid.Panel',{title:'ActionColumnDemo',store:Ext.data.StoreManager.lookup('employeeStore'),columns:[{text:'FirstName',dataIndex:'firstname'},{text:'LastName',dataIndex:'lastname'},{xtype:'actioncolumn',width:50,items:


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

原文地址: http://outofmemory.cn/yw/11334709.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存