BMP格式分析

C#下将BMP转换成二进制是比较容易的,方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
byte[] bufPic;
string filePath = "";
Stream myStream;
MemoryStream picFile = new MemoryStream();
OpenFileDialog open = new OpenFileDialog();
open.Filter = "bmp files (*.bmp) | *.bmp";
open.RestoreDirectory = true;
if (open.ShowDialog() == DialogResult.OK)
{
if ((myStream = login.OpenFile()) != null)
{
myStream.Close();
}
}

filePath = open.FileName.ToString();
Image image = Image.FromFile(filePath);
image.Save(picFile, ImageFormat.Bmp);
bufPic = picFile.GetBuffer();

其实转换的结果是以8位二进制分割的十进制数(0~255),若是真要得到纯二进制,还需要进一步转换。我曾做过很多实验,目的是测试这些数字和图片本身之间的关系,虽然学习过多媒体技术,但是对于详细的bmp分解,并没有太多认识。当然,在实验前还要把”二进制”还原bmp的方法说明一下:

1
2
3
4
5
6
7
8
using (MemoryStream ms = new MemoryStream(myPic))
{
Image image1 = Image.FromStream(ms);
ms.Close();
pic.Image = image1;
}

//其中mypic是byte类型,存放"二进制"的数组,pic是PictureBox控件

实验1: 人为的变动bufPic数组中的前几个位置,得到的结果都是出错,没能正确的还原回bmp,仔细观察后在发现,几乎所有的bmp转换成的bufPIc的前几个位置都相同,所以得到一个猜测:bmp文件不是单一的由图片的像素组成,还有一些默认的统一的”约定”

阅读更多

ADO.net存取image类型

最近试验需求,用到了sql server中的image字段,存取方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void Save()
{
using (System.IO.FileStream stream = new System.IO.FileStream())
{
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, (int)stream.Length);
stream.Close();
string strName = System.IO.Path.GetFileNameWithoutExtension(file);
SqlCommand cmd = new SqlCommand("Insert into Temp(name,photo) values(@name,@image)", sqlConn);
cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = strName;
cmd.Parameters.Add("@image", SqlDbType.Image).Value = buffer;
cmd.ExecuteNonQuery();
}
}

取:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void GetImage()
{
SqlCommand cmd = new SqlCommand(@"SELECT name, photo FROM Temp", sqlConn);
sqlConn.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
image_filename = (string)reader.GetValue(0);
byte[] image_bytes = (byte[])reader.GetValue(1);
MemoryStream ms = new MemoryStream(image_bytes);
Bitmap bmap = new Bitmap(ms);
return bmap;

}
}
阅读更多

C#定义变量左右值及桶模拟

上图显示了具有两个分支的变量i,这两个分支分别名为lvalue和rvalue.

变量的lvalue是指存储变量的内存地址。变量lvalue总是被解释为内存地址,是location value 的简写。

变量rvalue是指当前存储在变量中的实际值,代表register value。当定义一个变量时,lvalue先被赋值,值是分配的地址号。当对变量赋值时,rvalue被赋值,值就是被赋予的实际值。同时,lvalue与rvalue可以理解成变量的左右值,即left value和right value。

举例来说,语句

阅读更多

图解C#类的内存分配

对象的创建

格式:

clsPerson myFriend = new clsPerson();

或者

clsPerson myFriend;
myFriend = new clsPerson();
阅读更多

类与对象的理解

假如你和多年未见面的朋友安排见面,时间很久你已经记不清他的样子,因此您会询问他一些问题,同时描述自己:180cm,短发,黑色西装等等。


Person类: 属性列表 对象: 我 朋友


name Jack Lee

阅读更多