亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

C# 解析 RAS文件 SUM 光柵文件圖象的代碼

2024-07-10 13:26:03
字體:
來源:轉載
供稿:網友
使用方法:

復制代碼 代碼如下:


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
{
/// <summary>
/// SUN光柵圖形 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 私有
/// <summary>
/// 文件頭 956AA659
/// </summary>
private uint m_Mageic = 0x956AA659;
/// <summary>
/// 寬
/// </summary>
private uint m_Width = 0;
/// <summary>
/// 高
/// </summary>
private uint m_Height = 0;
/// <summary>
/// 顏色深
/// </summary>
private uint m_Depth = 0;
/// <summary>
/// 圖形區域數據大小
/// </summary>
private uint m_Length = 0;
/// <summary>
/// 數據類型
/// </summary>
private uint m_Type = 0;
/// <summary>
/// 色彩圖形類型
/// </summary>
private uint m_MapType = 0;
/// <summary>
/// 色彩長度
/// </summary>
private uint m_MapLength = 0;
/// <summary>
/// 顏色表
/// </summary>
private Color[] m_ColorList = new Color[256];
/// <summary>
/// 圖形
/// </summary>
private Bitmap m_Image;
#endregion
/// <summary>
/// 獲取圖形
/// </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>
/// 獲取數據
/// </summary>
/// <param></param>
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)]);
_StarIndex++;
}
_StarIndex += _ColorTable * 2;
break;
default:
break;
}
LoadData(p_ImageBytes, _StarIndex);
}
/// <summary>
/// 字節轉換為UINT
/// </summary>
/// <param>字節數組</param>
/// <param>開始位置</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>
/// 獲取反轉的BYTES
/// </summary>
/// <param></param>
/// <returns></returns>
private byte[] UintToBytes(uint p_Value)
{
byte[] _ValueBytes = BitConverter.GetBytes(p_Value);
Array.Reverse(_ValueBytes);
return _ValueBytes;
}
/// <summary>
/// 獲取圖形數據
/// </summary>
/// <param>文件留</param>
/// <param>RGB留開始位置</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("未實現!");
}
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>
/// 保存圖形
/// </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>
/// 保存圖形到RAS文件
/// </summary>
/// <param></param>
public void SaveRas(string p_File)
{
byte[] _Value = SaveImageOfRas();
if (_Value.Length != 0) File.WriteAllBytes(p_File, _Value);
}
}
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久之久亚州精品露出| 欧美在线一区二区三区四| 亚洲国产精品成人精品| 欧美最猛性xxxxx免费| 亚洲精品99久久久久| 欧美日韩高清区| 国产午夜精品久久久| 中文字幕视频在线免费欧美日韩综合在线看| 欧美日韩电影在线观看| www.日韩免费| 久久久久中文字幕2018| 中文字幕日本精品| 久久久久久午夜| 欧美床上激情在线观看| 欧美在线视频一区二区| 欧美国产亚洲精品久久久8v| 91在线视频一区| 尤物99国产成人精品视频| 欧洲永久精品大片ww免费漫画| 国内精品久久久久影院 日本资源| 日韩av在线网| 奇米影视亚洲狠狠色| 日韩有码在线播放| 国产亚洲美女久久| 亚洲精品电影久久久| 姬川优奈aav一区二区| 色偷偷噜噜噜亚洲男人| 青青在线视频一区二区三区| 亚洲一级黄色av| 国产精品免费电影| 国产不卡av在线免费观看| 北条麻妃一区二区在线观看| 午夜精品久久久久久久男人的天堂| 久久男人的天堂| 17婷婷久久www| 国产精品亚洲美女av网站| 国产美女精品视频免费观看| 91系列在线播放| 欧美日韩亚洲精品内裤| 亚洲成人网av| 最好看的2019的中文字幕视频| 欧美激情视频一区二区三区不卡| 中文字幕视频在线免费欧美日韩综合在线看| 色噜噜狠狠色综合网图区| 国产午夜精品理论片a级探花| 日本精品免费观看| 国产精品亚发布| 日本午夜在线亚洲.国产| 亚洲美女av电影| 欧美另类精品xxxx孕妇| 亚洲电影免费在线观看| 午夜精品久久久久久99热软件| 日韩激情在线视频| 超碰日本道色综合久久综合| 国产日本欧美一区二区三区在线| 久久天天躁狠狠躁夜夜躁| 久久成人免费视频| 日韩国产激情在线| 精品露脸国产偷人在视频| 在线观看欧美成人| 久久精品电影网站| 91精品国产高清自在线看超| 91视频免费网站| 亚洲精品国产精品乱码不99按摩| 欧美亚洲日本网站| 国产成人精品一区| 久久久国产91| 国产精品久久久久久av福利| 亚洲黄色www网站| 精品久久久香蕉免费精品视频| 欧美亚洲国产日本| 国产福利精品在线| 97人人爽人人喊人人模波多| 国产精品欧美风情| 国产精品6699| 国产成人精品日本亚洲| 菠萝蜜影院一区二区免费| 日韩av网址在线| 亚洲片在线观看| 国产精品自在线| 91亚洲精品久久久久久久久久久久| 欧美一级大片在线免费观看| 亚洲免费av片| 欧美黑人性视频| 狠狠躁夜夜躁人人躁婷婷91| 国产激情综合五月久久| 欧美日韩国产精品专区| 亚洲精品久久久久国产| 欧美电影免费观看高清完整| 亚洲女人被黑人巨大进入al| 欧美黑人狂野猛交老妇| 亚洲日本中文字幕免费在线不卡| 国产精品一香蕉国产线看观看| 在线亚洲午夜片av大片| 欧美成人精品一区二区| 日韩精品在线私人| 久久九九全国免费精品观看| 欧美在线一区二区三区四| 最近2019年好看中文字幕视频| 国产日韩av高清| 国产精品丝袜白浆摸在线| 久久精品国产亚洲一区二区| 欧美亚洲日本网站| 韩国v欧美v日本v亚洲| 狠狠躁夜夜躁人人爽超碰91| 日韩欧美亚洲成人| 国产日韩综合一区二区性色av| 亚洲精选中文字幕| 国产精品高潮呻吟视频| 九九九热精品免费视频观看网站| 欧美亚洲在线观看| 国产精品高潮呻吟久久av黑人| 日韩亚洲第一页| 亚洲理论在线a中文字幕| 奇米四色中文综合久久| 国产一区二区视频在线观看| 欧美精品电影在线| 日韩电影在线观看中文字幕| 欧美激情图片区| 美女视频黄免费的亚洲男人天堂| 俺去了亚洲欧美日韩| 亚洲精品电影网| 国产美女高潮久久白浆| 国模精品视频一区二区三区| 91久久精品美女高潮| 性色av一区二区三区在线观看| 亚洲影影院av| 日韩欧亚中文在线| 国产欧美精品日韩精品| 色偷偷9999www| 欧美激情a在线| 78色国产精品| 欧美视频在线免费| 九九精品视频在线| 国产精品18久久久久久首页狼| 国产精品视频白浆免费视频| 亚洲成av人乱码色午夜| 欧美超级免费视 在线| 国产精品久久久久久网站| 国产精品一久久香蕉国产线看观看| 91青草视频久久| 最近更新的2019中文字幕| 久久精品一区中文字幕| 91久久久亚洲精品| 精品日本高清在线播放| 欧美日韩亚洲天堂| 在线色欧美三级视频| 欧美成人在线网站| 欧美激情一二三| 欧美色视频日本高清在线观看| 国产精品18久久久久久首页狼| 亚洲欧美制服中文字幕| 在线观看国产欧美| 日韩中文字在线| 91精品在线影院| 亚洲影院色在线观看免费| 日韩最新在线视频| 亚洲福利视频网| 欧美自拍视频在线观看| 狠狠久久亚洲欧美专区| 欧美精品亚州精品| 在线一区二区日韩| 日本免费一区二区三区视频观看| 久久激情视频久久|