功能需求

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. lombk在IDEA中报ClassNotFoundException错误

    今天接手了一个项目,用到了lombk,第一次用到,做为纯JAVA来说,确实不错. 不过在使用中碰到了一个问题,就是在IDEA中,可以在结构中看到getter和setter等都已经正确的生成了,但是运行 ...

  2. QT5.4 计算器程序 打包&发布,解决dll的最新解决方案(图文并茂,很清楚)

    QT写界面还是很不错,就是打包会比较麻烦,折腾了一天总算是打包完成了. QT软件的打包发布一个难点是必备dll文件的识别,现在高版本QT自带了一个windeployqt工具,直接会把需要的dll生成一 ...

  3. STC15?MSP430?ARM?DSP?

    自从大学毕业以来,发现属于自己的时间越来越少,每天忙于工作,导致在大学学到的东西都好生疏,特别是大一刚开始学的模电,单片机等,现在才慢慢的抓起来,然后在这个多核处理器流行的时代,单片机貌似快过时了,但 ...

  4. HBA简介及原理

    HBA,即主机总线适配器英文“Host Bus Adapter”缩写.是一个使计算机在服务器和存储装置间提供输入/输出(I/O)处理和物理连接的电路板和/或集成电路适配器. 简介 主机总线适配器(Ho ...

  5. ZOJ 38727(贪心)

    这道题真心坑.越想越远  想的飞起来了. 最后纠结起后缀表达式的定义来了. 题意: 就是给你一个串 ,  让你用最少改动次数来实它变成一个合法的后缀表达式,  改动方式有两种, 一种是直接加入数字或者 ...

  6. FPGA STA(静态时序分析)

    1 FPGA设计过程中所遇到的路径有输入到触发器,触发器到触发器,触发器到输出,例如以下图所看到的: 这些路径与输入延时输出延时,建立和保持时序有关. 2. 应用背景 静态时序分析简称STA,它是一种 ...

  7. c/c++处理参数

    直接上代码:涉及函数getopt(),getopt_long() #include <unistd.h> #include <stdlib.h> #include <st ...

  8. Windows API中几个函数的总结

    [DllImport("User32.dll", EntryPoint = "FindWindow")] public static extern IntPtr ...

  9. XGPush集成(信鸽集成)demo

    #import "AppDelegate.h" #import "XGPush.h" #import "XGSetting.h" #defi ...

  10. VS2015 启用“仅我的代码”

    在调试网站的时候,如果不勾选 [启用"仅我的代码"],会跳出一大堆异常,但是异常不作处理,非常烦人: 解决办法就是在 [调试]->[选项]->[勾选 启用"仅 ...