15赞
932
当前位置:  开发笔记 > 编程语言 > 正文

C#解析RAS文件SUM光栅文件图象的代码

C#解析RAS文件(SUM光栅文件图象)我只实现了24位色和8位色这个结构也太简单了。只有文件头和数据区。
使用方法:>
复制代码 代码如下:


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


_Ras.SaveRas(@"d:\temp\OK.ras"); >


我只实现了24位色和8位色 这个结构也太简单了。只有文件头和数据区 。就是8位色的色彩表有些特殊
先是红色表 绿色表 蓝色表 平时都是 RGB、RGB 这样放 这东西居然RRRR.....GGG......B....


不知道怎么想的。
项目多了很少有时间做这些东西了。下个目标是IFF文件

>全部代码

复制代码 代码如下:


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
>


{
///

/// SUN光栅图形 RAS
/// zgke@sina.com


/// qq:116149 >///
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 私有
///


/// 文件头 956AA659
///
>


private uint m_Mageic = 0x956AA659;
///

/// 宽 >///


private uint m_Width = 0;
///

/// 高 >///


private uint m_Height = 0;
///

/// 颜色深

>///
private uint m_Depth = 0;


///
/// 图形区域数据大小


///

private uint m_Length = 0;

///
>

/// 数据类型 >///
private uint m_Type = 0;

///


/// 色彩图形类型 >///

private uint m_MapType = 0;
///


/// 色彩长度

///

private uint m_MapLength = 0;
///


/// 颜色表 >///

private Color[] m_ColorList = new Color[256];
//
/
>


/// 图形
///


private Bitmap m_Image;>



#endregion
///


/// 获取图形
>///

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;
}
}
}
}


///
/// 获取数据
///
///
private void LoadImage(byte[] p_ImageBytes)
{

if (BitConverter.ToUInt32(p_ImageBytes, 0) != m_Mageic) throw new Exception("文件头不正确!");
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)]);
_StarInde


x

+
+
;

}
_StarIndex += _ColorTable * 2;
bre
a
k

;

default:
break;

}
LoadData(p_ImageBytes, _StarIndex);
}

///
/// 字节转换为UINT >///

/// 字节数组
/// 开始位



///
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);

}

///


/// 获取反转的BYTES
///

///
///
private byte[] UintToBytes(uint p_Value)
>
{


byte[] _ValueBytes = BitConverter.GetBytes(p_Value);
Array.Reverse(_ValueBytes);

return _ValueBytes;

}
///
/// 获取图形数据 >///
/// 文件留>

/// RGB留开始位置>


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("未实现!");
}
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);


}
///
/// 保存图形
///

///
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;

}
///
/// 保存图形到RAS文件
>
>///
///
public void SaveRas(string p_File)
{
byte[] _Value = SaveImageOfRas();
if (_Value.Length != 0) File.WriteAllBytes(p_File, _Value);
}
}
}

推荐阅读
  • Java数据结构之单链表详解
    在之前的学习中,我们主要了解了很多Java的基本语法,但是在之后的Java学习中,了解基础数据结构的知识非常重要,数据结构的思想可以帮助我们更加清晰明白的了解Java的解题思路等等.今天我们就来开始学习实现一个Java基础的单链表,需要的朋友可以参考下 ... [详细]
  • wordpress程序是用PHP语言写成的。WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的。 ... [详细]
  • wordpress网站更换主题:登录WordPress后台,在后台中找到外观-主题,可以使用WordPress自带的主题,也可以自己上传安装,可以在后台直接上传然后安装。 ... [详细]
  • WordPress主题本地安装的方法:首先登录WordPress后台;然在后台菜单栏的外观中找到主题;接着点击“安装主题”可以搜索和在线安装主题,也可以到网上下载主题,解压后直接复制到themes文件夹中即可。 ... [详细]
  • docker环境安装WordPress的方法:首先通过docker命令行创建一个mariadb数据库;然后通过命令下载WordPress;接着使用命令查看IP;最后使用浏览器打开此IP地址,即可访问后台安装程序进行安装。 ... [详细]
  • WordPress适配手机端可以通过插件来实现,安装插件“WordPressmobilethemes”并启用,下载并安装手机端主题,然后到网站后台设置主题应用于移动端。 ... [详细]
  • wordpress仿站:先将目标网站抓取下来,可以使用工具进行抓取,将文件保存到wp-contenttust,然后建立标准的wp文件,然后对文件进行分割和修改。 ... [详细]
  • 进入WordPress博客后台,找到widgets小工具,将Text工具拖入侧边栏,展开Text直接将广告代码粘贴进去保存即可。 ... [详细]
  • WordPress主题是可以直接使用的网站模板,会直接改变网站的设计,通常包括其布局。更改主题会改变网站在前端的外观,即访问者浏览网站时看到的内容。 ... [详细]
  • wordpress底部版权修改方法:首先登录wordpress后台,找到“外观”-“编辑”,然后进入“编辑”页面,找到“底部(footer.php)”,找到相关代码删除,改为自己的版权信息即可。 ... [详细]
devbox
手机用户2602915241
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有 京ICP备19059560号-4