Image类的序列化

利用GDI+图形设备接口提供的Image类我们可以很方便地显示JPEG、GIF等文件格式的图片,但美中不足的是Image类未提供序列化数据的功能,如果要将从JPEG、GIF等格式的文件中读取的图片数据保存到我们自己开发的应用程序文档中,并能从文档中读取已经保存的图片数据并正确的显示出来,就必须实现Image类数据的序列化。 假如在你的文档类中有个指向Image类的成员指针变量m_pImage用于显示图片,那么在文档类的序列化函数Serialize(CArchive& ar)中加入以下的代码就能实现m_pImage所指向的图片数据的序列化: if (ar.IsStoring())
{
  HGLOBAL m_hMem = GlobalAlloc(GMEM_MOVEABLE, 0);
  IStream *pstm=NULL;
  CreateStreamOnHGlobal(m_hMem, TRUE, &pstm);
  CLSID clsid;
  USES_CONVERSION;
  GetCodecClsid(A2W("image/bmp"), &clsid);
  m_pImage->Save(pstm,&clsid,NULL);
  if (pstm==NULL)
    return;
  LARGE_INTEGER liBeggining = { 0 };
  pstm->Seek(liBeggining, STREAM_SEEK_SET, NULL);
  DWORD wTemp=GlobalSize(m_hMem);
  LPBYTE lpData = (LPBYTE)GlobalLock(m_hMem);
  ar << wTemp;
    ar.Write(lpData,wTemp);
  pstm->Release();
  GlobalUnlock(m_hMem);
}
else
{
  DWORD wTemp;
    ar >> wTemp;
  HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, wTemp);
  if (m_hMem == NULL)
    return;
  IStream *pstm=NULL;
  CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
  if (pstm==NULL)
    return;
  BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
  ar.Read(pmem,wTemp);
  if (m_pImage) {
      delete m_pImage;
      m_pImage = NULL;
    }
  using namespace Gdiplus;
  m_pImage = Image::FromStream(pstm, FALSE);
  pstm->Release();
  GlobalUnlock(m_hMem);
  //注意此处不能加GlobalFree(m_hMem);否则图片显示不出来。
其中函数GetCodecClsid的实现代码如下:int GetCodecClsid(const WCHAR* format, CLSID* pClsid)
{
  UINT num = 0;     // number of image encoders
  UINT size = 0;     // size of the image encoder array in bytes
  using namespace Gdiplus;
  ImageCodecInfo* pImageCodecInfo = NULL;
  GetImageEncodersSize(&num, &size);
  if(size == 0)
   return -1; // Failure
  pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
  if(pImageCodecInfo == NULL)
   return -1; // Failure
  GetImageEncoders(num, size, pImageCodecInfo);
  for(UINT j = 0; j < num; ++j)
  {
   if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
   {
     *pClsid = pImageCodecInfo[j].Clsid;
     return j; // Success
   }  
  } // for
  return -1; // Failure
} // GetCodecClsid
形参format用以说明图片数据的保存格式,可以取以下一些值:"image/bmp"(位图格式),"image/jpeg"(JPEG格式),"image/gif"(GIF格式)等。

时间: 2024-08-26 07:47:09

Image类的序列化的相关文章

c++类的序列化问题请教

问题描述 c++类的序列化问题请教 各位大神,小弟需要将一个c++类序列化为json来进行网络传输,有一个小小问题想请教一下,我在网上查了一下,很多都说要用jsoncpp.看了很久还是不知道这个序列化的方法. 现在假设我有一个类如下: class A { public: int A; void hello(); } 请问我要怎么进行序列化呢 解决方案 简单的话,直接拼接字符串就可以了. 解决方案二: 序列化使用jsoncpp或者之类的库,还是需要自己写序列化代码的 参考:http://qiusu

c# WebService soap 序列化. webservice 自定义类参数序列化的问题.

问题描述 Webservice接口如下:[WebMethod]publicvoidSetCacheValue(stringkey,objectvalue){Cache.Insert(key,value);}在客户端有如下的调用:WebserviceInterface.ClassNamei=newWebserviceInterface.ClassName();ClassEntityAentityA=newClassEntityA();entityA.strA="a";ClassEntit

Java序列化,怎么把一个类,序列化到一个文件中去呢?

问题描述 已经有一个文件,想把类序列化到文件中,然后再从文件中反序列化,怎么实现呢? 问题补充:好吧,是这样的,其实就是基本文件流的操作,当时一时糊涂没想明白,多谢了 ! 解决方案 //创建一个可序列化类Personimport java.io.Serializable;public class Person implements Serializable{private String name;private String sex;public Person(String name,Strin

如何通过对类的序列化实现WCF的远程接口调用?

问题描述 我建立的服务器端和用户端通过WCF实现接口调用,简单说来是传递一个自定义类对象,当然大家会想到序列化,我选用的是BinaryFormatter+MemoryStream,但不管是流类型传递还是转换为byte[]传递都会出现问题(如果各位大神对问题的种类感兴趣我可以给大家截图),我想请教大神们的是:1.基于BinaryFormatter应该选用什么流类型?2.除了Http传输以及Socket传输之外,用纯粹的WCF接口调用怎么远程传递一个自定义对象?IDE是VS2010,语言C#.下面是

C# 类的序列化和反序列化

有时候我们希望把类的实例保存下来,以便以后的时候用.一个直观的方法就是StreamWriter把类写成一行,用t分隔开每个属性,然后用StreamReader读出来. 但是这样太麻烦,代码行数较多,而且必须事先知道属性在行中的对应位置.这时候如果采用类序列化的方式保存就使得代码很简单: 假如你有一个类,在它的上面加上[Serializable]属性就可以了,表示这个类是可以序列化的 [Serializable]   代码如下 复制代码 public class People  {     pub

自定义Hadoop的可序列化类

java原生语言中要想一个自定义类可序列化,很简单,只要让这个类实现java.io.Serializable接口就可以了,但是在Hadoop框架中,要想让自定义类可以被序列化,我们必须手动让其实现WritableCompable接口并且实现write(),readFields(),compareTo()方法. 下面就是一个我们自定义的可序列化的类: /* */ package com.charles.writable; import java.io.DataInput; import java.

.NET(C#):XML序列化时派生类的处理

原文 www.cnblogs.com/mgen/archive/2011/12/03/2275014.html 目录 1. 针对基类的XmlSerializer序列化派生类 2. 类内成员是派生类的序列化   注意: 运行代码请注意添加如下命名空间: using System.Xml; using System.Xml.Serialization; using System.IO;     返回目录 1. 针对基类的XmlSerializer序列化派生类 派生类将会序列化成这样的XML: <基类

请教C#下如何序列化自定义结构或类?

问题描述 各位高手:请问在C#中使用Binaryformater将自定义数据结构序列化时,如定义结构structSTData{intnum;chartype;shortarr;doublex;};结构采用单字节对齐方式,序列化后字节的数组比结构实际的字节数要大几倍,如何让序列化后字节数组的大小等于实际结构的字节数?由于需要C#通过UDP与VC6之间进行数据通信,在VC6中结构使用单字节对齐后,转换后的字节数组就是实际结构的字节之和,而如果C#转换后的字节数组大小与VC6的字节数组大小不同就无法确

在 WCF 中使用高效的 BinaryFormatter 序列化

本文将定义一个 WCF 终结点行为扩展,以在 WCF 中使用更高效的 BinaryFormatter 进行二进制序列化,并实现对是否使用传统二进制序列化功能的可配置. 介绍 实现步骤 使用方法 效果   介绍 在 OEA 框架中,是使用 WCF 作为数据传输框架.但是使用 WCF 内部的二进制序列化,序列化后的数据大小,要比使用传统的 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 类进行序列化后的数据大小要大得多.作