功能需求

1、把一张图片(png bmp jpeg bmp gif)转换为byte数组在内存中操作。

2、把内存中的byte数组转换成Image对象,赋值给相应的控件显示。

3、从图片byte数组得到对应的图片格式,生成一张图片保存到磁盘中。

这个的Image是System.Drawing.Image。

//Get an image from file
Image image = Image.FromFile("D:\\test.jpg");
Bitmap bitmap = new Bitmap("D:\\test.jpg");

  一下三个函数分别实现了上述三个需求:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Drawing.Imaging;
using System.Drawing;
using System.IO; namespace NetUtilityLib
{
public class ImageHelper
{
/// <summary>
/// Convert Image to Byte[]
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
public static byte[] ImageToBytes(Image image)
{
ImageFormat format = image.RawFormat;
using (MemoryStream ms = new MemoryStream())
{
//复杂一点的判断
//if(format.Equals(ImageFormat.Jpeg))
//{
// image.Save(ms, ImageFormat.Jpeg);
//}
//else if (format.Equals(ImageFormat.Png))
//{
// image.Save(ms, ImageFormat.Png);
//}
//else if(format.Equals(ImageFormat.Bmp))
//{
// image.Save(ms, ImageFormat.Bmp);
//}
//else if (format.Equals(ImageFormat.Gif))
//{
// image.Save(ms, ImageFormat.Gif);
//}
//else if (format.Equals(ImageFormat.Icon))
//{
// image.Save(ms, ImageFormat.Icon);
//} //直接搞定
image.Save(ms, format); byte[] buffer = new byte[ms.Length];
//Image.Save()会改变MemoryStream的Position,需要重新Seek到Begin也就是开始的0位置
ms.Seek(0, SeekOrigin.Begin);
ms.Read(buffer, 0, buffer.Length); return buffer;
}//using }//ImageToBytes /// <summary>
/// Convert Byte[] to Image
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static Image BytesToImage(byte[] buffer)
{
MemoryStream ms = new MemoryStream(buffer);
Image image = Image.FromStream(ms); return image;
}//BytesToImage /// <summary>
/// Convert Byte[] to a picture and Store it in file
/// </summary>
/// <param name="fileName"></param>
/// <param name="buffer"></param>
/// <returns></returns>
public static string CreateImageFromBytes(string fileName, byte[] buffer)
{
//获取图片的格式
Image image = BytesToImage(buffer);
ImageFormat format = image.RawFormat;
//根据格式,设定后缀
if (format.Equals(ImageFormat.Jpeg))
{
fileName += ".jpeg";
}
else if (format.Equals(ImageFormat.Png))
{
fileName += ".png";
}
else if (format.Equals(ImageFormat.Bmp))
{
fileName += ".bmp";
}
else if (format.Equals(ImageFormat.Gif))
{
fileName += ".gif";
}
else if (format.Equals(ImageFormat.Icon))
{
fileName += ".icon";
}
//创建文件目录
FileInfo info = new FileInfo(fileName);
Directory.CreateDirectory(info.Directory.FullName);
//把数组写到指定的位置
File.WriteAllBytes(fileName, buffer); return fileName;
}//CreateImageFromBytes
}
}

  做一些介绍

Stream流类

流是 字节序列的抽象,这些字节可能来自与文件、TCP/IP套接字或内存。在.NET中,通过 Stream类适当地表示流。Stream类提供了字节序列的通用视图。

Stream类是其他所有流的基类,并且有如下的类实现:

  • BufferedStream:提供另一个流上的缓冲层以改进性能
  • FileStream:提供读写文件的方法
  • MemoryStream:提供使用内存作为后备存储器的流
  • NetworkStream:提供访问网络上的数据的方法
  • CryptoStream:提供供应加密变换数据的方法

本博文中主要用到了MemoryStream,所以只对其做介绍,其他的在参考文章链接中。

有时需要在内存中操作数据,而不是采取将这些数据保存在文件中的方式,相应的示例是WindowsForm中的PictrueBox控件。例如 ,你有一张显示在PictureBox控件中的图片,并且希望将图片发送到远程服务器,例如Web Service.PictureBox控件有一个Save()方法,通过该方法可以将图像保存到Stream对象。

相比于将图像保存到FileStream对象,然后将该文件中的数据重新加载到字节数组中,更好的方法是使用MemoryStream对象,该对象使用内存作为后备存储器(相比于执行文件I/O,使用内存更为有效;文件I/O的执行速度相对缓慢)。

Image.Save方法

Image.Save 方法 (Stream, ImageFormat)

  这个方法将图像以指定的格式保存到指定的流中。图像必须保存到零偏移量的流中。 如果在保存图像之前已经将任何附加数据写入到流,则流中的图像数据会损坏。

参考资料

Stream流类链接:http://blog.csdn.net/gengkunpeng/article/details/5797231

[C#参考]byte数组和Image的相互转换的更多相关文章

  1. iOS-NSdata 与 NSString,Byte数组,UIImage 的相互转换

    IOS---NSdata 与 NSString,Byte数组,UIImage 的相互转换 1. NSData 与 NSString NSData-> NSString NSString *aSt ...

  2. C# byte数组与Image的相互转换

    功能需求: 1.把一张图片(png bmp jpeg bmp gif)转换为byte数组存放到数据库. 2.把从数据库读取的byte数组转换为Image对象,赋值给相应的控件显示. 3.从图片byte ...

  3. ios -- NSdata 与 NSString,Byte数组,UIImage 的相互转换(转)

    1. NSData 与 NSStringNSData-> NSStringNSString *aString = [[NSString alloc] initWithData:adata enc ...

  4. NSdata 与 NSString,Byte数组,UIImage 的相互转换

    1. NSData 与 NSString NSData-> NSString NSString *aString = [[NSString alloc] initWithData:adataen ...

  5. C# byte数组与Image的相互转换【转】

    功能需求: 1.把一张图片(png bmp jpeg bmp gif)转换为byte数组存放到数据库. 2.把从数据库读取的byte数组转换为Image对象,赋值给相应的控件显示. 3.从图片byte ...

  6. java byte数组与String的相互转换

    String  ->   byte数组 String str = "abc天"; byte[] btr = str.getBytes(); System.out.printl ...

  7. byte数组和文件的相互转换

    /** * 获得指定文件的byte数组 */ private byte[] getBytes(String filePath){ byte[] buffer = null; try { File fi ...

  8. Java 中 byte、byte 数组和 int、long 之间的转换

    Java 中 byte 和 int 之间的转换源码: //byte 与 int 的相互转换 public static byte intToByte(int x) { return (byte) x; ...

  9. java byte数组与16进制间的相互转换

      java byte数组与16进制间的相互转换 CreationTime--2018年6月11日15点34分 Author:Marydon 1.准备工作 import java.util.Array ...

随机推荐

  1. java selenium webdriver实战 helloWord

    第一步:建立Maven项目 Selenium 支持 maven 工程,这会让你的工作更加简便. 用 Eclipse 建个 Maven 的工程,建成后,修改 pom.xml <dependenci ...

  2. DateTimePicker——开源的Android日历类库

    Github托管地址:https://github.com/flavienlaurent/datetimepicker

  3. GDI泄露检测

    前一段在一个仿QQ的IM通讯工具中加入屏幕截图以及截图编辑功能,但是测试中发现当连续进行几十次截图后,系统会出现白屏,开始以为和win7经常闪白有关,屏幕截图截取到闪白的瞬间导致白屏,后来发现是GDI ...

  4. 简单makefile的写法

    一个项目下的文件比较多,如果单个的输入,比较费劲,所以就需要把编译过程写进一个MakeFile文件中. 下面建立5个文件,3个cxx文件,2个hxx头文件 //filename main.cxx #i ...

  5. UVA122-Trees on the level(链二叉树)

    Trees on the level Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Sub ...

  6. Cube Stacking(并差集深度+结点个数)

    Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 21567   Accepted: 7554 Ca ...

  7. Objective-C分类 (category)和扩展(Extension)

    1.分类(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以 ...

  8. MyEclipse性能调优初体验

    MyEclipse性能调优初体验 简介一下工作环境,MyEclipse2014,你懂的 项目中有一个基于web的工作流引擎,仅仅要执行起来就CPU差点儿耗尽(尽管看似27%,事实上已经把俺4核的CPU ...

  9. Unity cg vertex and fragment shaders(一)

    cg片段 Cg程序片段写CGPROGRAM和ENDCG之间 开始时的片段可以作为#pragma语句编译指令 Pass { // ... the usual pass state setup ... C ...

  10. UVa1368/ZOJ3132 DNA Consensus String

    #include <stdio.h>#include <string.h> int main(){    int a[4][1000]; // A/C/G/T在每列中出现的次数 ...