logo

[转帖]Removing OLE Header from images stored in MS Access DB as OLE Object

作者:pranab 阅读:1225 发表于:2010-09-18 11:21:42

If you are storing images in Access DB table as OLE object, and you are adding images programmatically (for example uploading images from an aspx page), then you might not face this issue. This problem occurs when you are adding images directly into the Access database table after opening it through MS Access client. When you try to retrieve those images you will find those do not open in Web Pages or any other program. This is because Access adds OLE Header in front of those images.Here is a function that will remove the OLE Header from different types of images.
原文地址:http://blogs.msdn.com/b/pranab/archive/2008/07/15/removing-ole-header-from-images-stored-in-ms-access-db-as-ole-object.aspx

C# 代码
private byte[] GetImageBytesFromOLEField(byte[] oleFieldBytes)
{
  
const string BITMAP_ID_BLOCK = "BM";
  
const string JPG_ID_BLOCK = "\u00FF\u00D8\u00FF";
  
const string PNG_ID_BLOCK = "\u0089PNG\r\n\u001a\n";
  
const string GIF_ID_BLOCK = "GIF8";
  
const string TIFF_ID_BLOCK = "II*\u0000";


  
byte[] imageBytes;


  
// Get a UTF7 Encoded string version
  Encoding u8 = Encoding.UTF7;
  
string strTemp = u8.GetString(oleFieldBytes);


  
// Get the first 300 characters from the string
  string strVTemp = strTemp.Substring(0, 300);


  
// Search for the block
  int iPos = -1;
  
if (strVTemp.IndexOf(BITMAP_ID_BLOCK) != -1)
    iPos
= strVTemp.IndexOf(BITMAP_ID_BLOCK);
  
else if (strVTemp.IndexOf(JPG_ID_BLOCK) != -1)
    iPos
= strVTemp.IndexOf(JPG_ID_BLOCK);
  
else if (strVTemp.IndexOf(PNG_ID_BLOCK) != -1)
    iPos
= strVTemp.IndexOf(PNG_ID_BLOCK);
  
else if (strVTemp.IndexOf(GIF_ID_BLOCK) != -1)
    iPos
= strVTemp.IndexOf(GIF_ID_BLOCK);
  
else if (strVTemp.IndexOf(TIFF_ID_BLOCK) != -1)
    iPos
= strVTemp.IndexOf(TIFF_ID_BLOCK);
  
else
    
throw new Exception("Unable to determine header size for the OLE Object");


  
// From the position above get the new image
  if (iPos == -1)
    
throw new Exception("Unable to determine header size for the OLE Object");


  
//Array.Copy(
  imageBytes = new byte[oleFieldBytes.LongLength - iPos];
  MemoryStream ms
= new MemoryStream();
  ms.Write(oleFieldBytes, iPos, oleFieldBytes.Length
- iPos);
  imageBytes
= ms.ToArray();
  ms.Close();
  ms.Dispose();
  
return imageBytes;
}