3-4-2
写二进制文件案例学习
u
本案例您将学习到:
n
图片文件二进制流的读取并显示在图像控件之中;
n
如何将图像控件图像读取到内存流,并另外存储;
n
saveFileDialog
控件在另存文件中的作用。
1.
案例学习:写二进制文件案例——图片的存储与复制
u
实验步骤(1):
由图
3-10
所示,从工具箱之中拖拽
MainMenu
控件、
SaveFileDialog
控件、
GroupBox
控件、
PictureBox
控件各一个到
Form
窗体上;
Form
窗体的
text
属性设置为“图片处理器”;
GroupBox
控件的
text
属性设置为“图片显示区”;
PictureBox
控件的
sizemode
属性设置为
zoom
;
MainMenu
控件添加菜单项及子项如表
3
-
15
所示:
表
3-15
图片处理器菜单控件的菜单项及子项设置
菜单项
|
子项
|
其他属性
|
图片(&P)
|
打开图片(&O)
|
快捷键等其他属性根据自己设计定(下同)
|
复制图片(&C)
|
|
|
关闭(&Q)
|
|
|
图
3-10
图片处理器界面图
u
实验步骤(2):
用鼠标双击主界面上菜单控件的所有菜单项,进入
.cs
文件编辑状态准备进行开发。代码加下:
///======================================代码编辑===========================================
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
using
System.IO;
namespace
FileOptionApplication
{
public partial class Form12 : Form
{
public Form12()
{
InitializeComponent();
}
/// <summary>
/*******************************************************
**方 法 名:GetFileBytes
**输 入参数:Filename:文件名称;
**输 出参数:比特流类型
**返 回 值:byte[]二进制流
**创 建 人:钱哨
**创 建日期:
**描 述:将读取的文件转化成为二进制流。
*******************************************************/
/// <summary>
/// </summary>
/// <param name="Filename">打开的图片具体路径及文件名称</param>
/// <returns>比特流类型</returns>
public byte[] GetFileBytes(string Filename)
{
if (Filename == "")
return null;
try
{
FileStream fileStream = new FileStream(Filename, FileMode.Open, FileAccess.Read);
BinaryReader binaryReader = new BinaryReader(fileStream);
byte[] fileBytes = binaryReader.ReadBytes((int)fileStream.Length);
binaryReader.Close();
fileStream.Close();
return fileBytes;
}
catch
{
return null;
}
}
/*******************************************************
**方 法 名:WriteFileBytes
**输 入参数:TargetFilename:目标文件名称;
**输 出参数:布尔类型:是否写成功
**返 回 值:byte[]二进制流
**创 建 人:钱哨
**创 建日期:
**描 述:将读取的文件转化成为二进制流。
*******************************************************/
/// </summary>
/// <param name="TargetFilename">目标文件</param>
/// <param name="fileBytes">文件比特流</param>
/// <returns>布尔类型:是否写成功</returns>
public bool WriteFileBytes(string TargetFilename, byte[] fileBytes)
{
bool k = true;
if (TargetFilename != "" && fileBytes.Length != 0)
{
try
{
FileStream fileStream = new FileStream(TargetFilename, FileMode.OpenOrCreate, FileAccess.Write);
BinaryWriter binaryWriter = new BinaryWriter(fileStream);
binaryWriter.Write(fileBytes);
binaryWriter.Flush();
binaryWriter.Close();
fileStream.Close();
}
catch
{
k = false;
}
}
else
{
k = false;
}
return k;
}
/// <summary>
/// 菜单:打开图片
/// </summary>
private void toolStripMenuItem3_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog openfile = new OpenFileDialog();
openfile.Filter = "jpg类型图片(*.jpg)|*.jpg|BMP类型图片(*.bmp)|*.bmp";
if (openfile.ShowDialog() == DialogResult.OK)
{
byte[] picbinary = GetFileBytes(openfile.FileName);
//第一步:打开图片文件,获得比特流
MemoryStream mempicstream = new MemoryStream(picbinary);
//第二步:将比特流还存在内存工作流中。
pictureBox1.Image = Image.FromStream(mempicstream);
//第三步:加载内存流到图片控件
mempicstream.Dispose();
mempicstream.Close();
}
}
catch (Exception m)
{
MessageBox.Show("读取图片出错,可能的问题是:"+Convert.ToString(m) ,"错误提示");
}
}
/// <summary>
/// 将打开的图片进行复制
/// </summary>
private void toolStripMenuItem4_Click(object sender, EventArgs e)
{
try
{
if (pictureBox1.Image == null)
{
MessageBox.Show("禁止图片为空时候另存信息。", "错误提示");
}
else
{
saveFileDialog1.Filter = "jpg类型图片(*.jpg)|*.jpg";
DialogResult result = saveFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
MemoryStream ms=new MemoryStream();
Bitmap bm = new Bitmap(pictureBox1.Image);
bm.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.ToArray();
WriteFileBytes(saveFileDialog1.FileName, bytes);
MessageBox.Show("另存图片成功", "提示");
ms.Dispose();
ms.Close();
bm.Dispose();
}
}
}
catch (Exception m)
{
MessageBox.Show("读取图片出错,可能的问题是:" + Convert.ToString(m),"错误提示");
}
}
}
}
|
u
实验步骤(3):
调试、运行程序,得到效果如图
3
-
11
所示:
图
3-11
图片处理器效果图
本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/210975,如需转载请自行联系原作者