C parsing RAS file SUM raster file image code

  • 2020-05-09 18:29:37
  • OfStack

Usage:
 
ImageRas _Ras = new ImageRas(@"D:\temp\test.ras"); 
pictureBox1.Image = _Ras.Image; 
_Ras.SaveRas(@"d:\temp\OK.ras"); 

I only implemented 24 bit colors and 8 bit colors which is too simple a structure. Only file headers and data areas. It's an 8-bit color table that's a little bit special
First, the red table, the green table, and the blue table are RGB, RGB, RRRR... GGG... B...
I don't know what to think.
There are too many projects and too little time to do these things. The next target is the IFF file
All the code
 
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.InteropServices; 
using System.Drawing.Imaging; 
using System.Drawing; 
using System.IO; 
namespace Zgke.MyImage.ImageFile 
{ 
/// <summary> 
/// SUN Raster graphics  RAS 
/// zgke@sina.com 
/// qq:116149 
/// </summary> 
public class ImageRas 
{ 
public ImageRas(string p_ImageFile) 
{ 
if (System.IO.File.Exists(p_ImageFile)) 
{ 
LoadImage(System.IO.File.ReadAllBytes(p_ImageFile)); 
} 
} 
public ImageRas() 
{ 
} 
#region  private  
/// <summary> 
///  The file header  956AA659 
/// </summary> 
private uint m_Mageic = 0x956AA659; 
/// <summary> 
///  wide  
/// </summary> 
private uint m_Width = 0; 
/// <summary> 
///  high  
/// </summary> 
private uint m_Height = 0; 
/// <summary> 
///  The darker  
/// </summary> 
private uint m_Depth = 0; 
/// <summary> 
///  Graph area data size  
/// </summary> 
private uint m_Length = 0; 
/// <summary> 
///  The data type  
/// </summary> 
private uint m_Type = 0; 
/// <summary> 
///  Color pattern type  
/// </summary> 
private uint m_MapType = 0; 
/// <summary> 
///  The length of the color  
/// </summary> 
private uint m_MapLength = 0; 
/// <summary> 
///  The color table  
/// </summary> 
private Color[] m_ColorList = new Color[256]; 
/// <summary> 
///  graphics  
/// </summary> 
private Bitmap m_Image; 
#endregion 
/// <summary> 
///  For graphics  
/// </summary> 
public Bitmap Image 
{ 
get 
{ 
return m_Image; 
} 
set 
{ 
if (value != null) 
{ 
m_Image = value; 
m_Width = (uint)value.Width; 
m_Height = (uint)value.Height; 
switch (value.PixelFormat) 
{ 
case PixelFormat.Format8bppIndexed: 
break; 
case PixelFormat.Format32bppArgb: 
break; 
default: 
m_Depth = 24; 
break; 
} 
} 
} 
} 
/// <summary> 
///  To get the data  
/// </summary> 
/// <param name="p_ImageBytes"></param> 
private void LoadImage(byte[] p_ImageBytes) 
{ 
if (BitConverter.ToUInt32(p_ImageBytes, 0) != m_Mageic) throw new Exception(" Incorrect file header! "); 
m_Width = BytesToUint(p_ImageBytes, 4); 
m_Height = BytesToUint(p_ImageBytes, 8); 
m_Depth = BytesToUint(p_ImageBytes, 12); 
m_Length = BytesToUint(p_ImageBytes, 16); 
m_Type = BytesToUint(p_ImageBytes, 20); 
m_MapType = BytesToUint(p_ImageBytes, 24); 
m_MapLength = BytesToUint(p_ImageBytes, 28); 
int _StarIndex = 32; 
switch (m_MapType) 
{ 
case 1: 
int _ColorTable = (int)m_MapLength / 3; 
for (int i = 0; i != _ColorTable; i++) 
{ 
m_ColorList[i] = Color.FromArgb(p_ImageBytes[_StarIndex], p_ImageBytes[_StarIndex + _ColorTable], p_ImageBytes[_StarIndex + (_ColorTable * 2)]); 
_StarIndex++; 
} 
_StarIndex += _ColorTable * 2; 
break; 
default: 
break; 
} 
LoadData(p_ImageBytes, _StarIndex); 
} 
/// <summary> 
///  Byte conversion to UINT 
/// </summary> 
/// <param name="p_Value"> An array of bytes </param> 
/// <param name="p_Index"> The starting position </param> 
/// <returns></returns> 
private uint BytesToUint(byte[] p_Value, int p_Index) 
{ 
byte[] _ValueBytes = new byte[4]; 
_ValueBytes[0] = p_Value[p_Index + 3]; 
_ValueBytes[1] = p_Value[p_Index + 2]; 
_ValueBytes[2] = p_Value[p_Index + 1]; 
_ValueBytes[3] = p_Value[p_Index]; 
return BitConverter.ToUInt32(_ValueBytes, 0); 
} 
/// <summary> 
///  Get reversed BYTES 
/// </summary> 
/// <param name="p_Value"></param> 
/// <returns></returns> 
private byte[] UintToBytes(uint p_Value) 
{ 
byte[] _ValueBytes = BitConverter.GetBytes(p_Value); 
Array.Reverse(_ValueBytes); 
return _ValueBytes; 
} 
/// <summary> 
///  Get graphic data  
/// </summary> 
/// <param name="p_ValueBytes"> File for </param> 
/// <param name="p_StarIndex">RGB Leave the starting position </param> 
private void LoadData(byte[] p_ValueBytes, int p_StarIndex) 
{ 
PixelFormat _Format = PixelFormat.Format24bppRgb; 
switch (m_Depth) 
{ 
case 8: 
_Format = PixelFormat.Format8bppIndexed; 
break; 
case 24: 
_Format = PixelFormat.Format24bppRgb; 
break; 
default: 
throw new Exception(" Not true! "); 
} 
m_Image = new Bitmap((int)m_Width, (int)m_Height, _Format); 
BitmapData _Data = m_Image.LockBits(new Rectangle(0, 0, m_Image.Width, m_Image.Height), ImageLockMode.ReadWrite, m_Image.PixelFormat); 
byte[] _WriteBytes = new byte[_Data.Height * _Data.Stride]; 
int _StarIndex = 0; 
int _WriteIndex = 0; 
for (int i = 0; i != _Data.Height; i++) 
{ 
_WriteIndex = i * _Data.Stride; 
_StarIndex = i * ((int)m_Length / (int)m_Height) + p_StarIndex; 
for (int z = 0; z != _Data.Width; z++) 
{ 
switch (m_Depth) 
{ 
case 8: 
_WriteBytes[_WriteIndex] = p_ValueBytes[_StarIndex]; 
_WriteIndex++; 
_StarIndex++; 
break; 
case 24: 
_WriteBytes[_WriteIndex] = p_ValueBytes[_StarIndex + 2]; 
_WriteBytes[_WriteIndex + 1] = p_ValueBytes[_StarIndex + 1]; 
_WriteBytes[_WriteIndex + 2] = p_ValueBytes[_StarIndex]; 
_WriteIndex += 3; 
_StarIndex += 3; 
break; 
} 
} 
} 
switch (m_Depth) 
{ 
case 8: 
ColorPalette _Palette = m_Image.Palette; 
for (int i = 0; i != m_ColorList.Length; i++) 
{ 
_Palette.Entries[i] = m_ColorList[i]; 
} 
m_Image.Palette = _Palette; 
break; 
default: 
break; 
} 
Marshal.Copy(_WriteBytes, 0, _Data.Scan0, _WriteBytes.Length); 
m_Image.UnlockBits(_Data); 
} 
/// <summary> 
///  Save image  
/// </summary> 
/// <returns></returns> 
private byte[] SaveImageOfRas() 
{ 
if (m_Image == null) return new byte[0]; 
MemoryStream _Stream = new MemoryStream(); 
_Stream.Write(BitConverter.GetBytes(m_Mageic), 0, 4); 
_Stream.Write(UintToBytes(m_Width), 0, 4); 
_Stream.Write(UintToBytes(m_Height), 0, 4); 
switch (m_Depth) 
{ 
case 8: 
BitmapData _Data256 = m_Image.LockBits(new Rectangle(0, 0, m_Image.Width, m_Image.Height), ImageLockMode.ReadOnly, m_Image.PixelFormat); 
byte[] _DataBytes = new byte[_Data256.Stride * _Data256.Height]; 
int _Stride = _Data256.Stride; 
Marshal.Copy(_Data256.Scan0, _DataBytes, 0, _DataBytes.Length); 
m_Image.UnlockBits(_Data256); 
_Stream.Write(UintToBytes(8), 0, 4); 
uint _WidthCount = (uint)m_Image.Width; 
if (m_Image.Width % 2 != 0) _WidthCount = (uint)m_Image.Width + 1; 
uint _AllCount = _WidthCount * (uint)m_Image.Height; 
_Stream.Write(UintToBytes(_AllCount), 0, 4); 
_Stream.Write(UintToBytes(0), 0, 4); 
_Stream.Write(UintToBytes(1), 0, 4); 
_Stream.Write(UintToBytes(768), 0, 4); 
byte[] _RedBytes = new byte[256]; 
byte[] _GreenBytes = new byte[256]; 
byte[] _BlueBytes = new byte[256]; 
for (int i = 0; i != 256; i++) 
{ 
_RedBytes[i] = m_Image.Palette.Entries[i].R; 
_GreenBytes[i] = m_Image.Palette.Entries[i].G; 
_BlueBytes[i] = m_Image.Palette.Entries[i].B; 
} 
_Stream.Write(_RedBytes, 0, _RedBytes.Length); 
_Stream.Write(_GreenBytes, 0, _GreenBytes.Length); 
_Stream.Write(_BlueBytes, 0, _BlueBytes.Length); 
byte[] _Write = new byte[_WidthCount]; 
for (int i = 0; i != m_Image.Height; i++) 
{ 
Array.Copy(_DataBytes, i * _Stride, _Write, 0, _WidthCount); 
_Stream.Write(_Write, 0, _Write.Length); 
} 
break; 
default: 
Bitmap _NewBitmap = new Bitmap(m_Image.Width, m_Image.Height, PixelFormat.Format24bppRgb); 
Graphics _Graphics = Graphics.FromImage(_NewBitmap); 
_Graphics.DrawImage(m_Image, new Rectangle(0, 0, m_Image.Width, m_Image.Height)); 
_Graphics.Dispose(); 
BitmapData _Data24 = _NewBitmap.LockBits(new Rectangle(0, 0, _NewBitmap.Width, _NewBitmap.Height), ImageLockMode.ReadOnly, _NewBitmap.PixelFormat); 
byte[] _DataBytes24 = new byte[_Data24.Stride * _Data24.Height]; 
int _Stride24 = _Data24.Stride; 
Marshal.Copy(_Data24.Scan0, _DataBytes24, 0, _DataBytes24.Length); 
_NewBitmap.UnlockBits(_Data24); 
_Stream.Write(UintToBytes(24), 0, 4); 
uint _WidthCount24 = (uint)_NewBitmap.Width; 
if (_NewBitmap.Width % 2 != 0) _WidthCount24 = (uint)_NewBitmap.Width + 1; 
uint _AllCount24 = _WidthCount24 * (uint)_NewBitmap.Height * 3; 
_WidthCount24 = _WidthCount24 * 3; 
_Stream.Write(UintToBytes(_AllCount24), 0, 4); 
_Stream.Write(UintToBytes(0), 0, 4); 
_Stream.Write(UintToBytes(0), 0, 4); 
_Stream.Write(UintToBytes(0), 0, 4); 
byte[] _Write24 = new byte[0]; 
for (int i = 0; i != m_Image.Height; i++) 
{ 
_Write24 = new byte[_WidthCount24]; 
int _WriteIndex = 0; 
int _StarIndex = i * _Stride24; 
for (int z = 0; z != m_Image.Width; z++) 
{ 
_Write24[_WriteIndex] = _DataBytes24[_StarIndex + 2]; 
_Write24[_WriteIndex + 1] = _DataBytes24[_StarIndex + 1]; 
_Write24[_WriteIndex + 2] = _DataBytes24[_StarIndex]; 
_WriteIndex += 3; 
_StarIndex += 3; 
} 
_Stream.Write(_Write24, 0, _Write24.Length); 
} 
_NewBitmap.Dispose(); 
break; 
} 
byte[] _Return = _Stream.ToArray(); 
return _Return; 
} 
/// <summary> 
///  Save the graph to RAS file  
/// </summary> 
/// <param name="p_File"></param> 
public void SaveRas(string p_File) 
{ 
byte[] _Value = SaveImageOfRas(); 
if (_Value.Length != 0) File.WriteAllBytes(p_File, _Value); 
} 
} 
} 

Related articles: