C# работа с байтами изображения
Недавно начал изучать один древний игровой формат изображения.Из одной моей любимой игры(SpaceRangers HD).Хочу попробовать конвертировать его в современный формат png.
И так вот ближе к сути,как можно быстрее(в плане написания кода) читать файл преобразованный в массив байтов файл изображения,и можно ли подразбить скажем массив изображения на header и данные самого изображения для удобной работы?
Также я слышал что может помочь работа с буферами(так ли это)?
Ответы (1 шт):
Покажу кратко, вот структура заголовков https://github.com/ObKo/OpenSR/blob/rework/include/OpenSR/libRangerQt.h на C++, в принципе она на C# переписывается только заменой uint32_t на public uint.
struct GIFrameHeader
{
uint32_t signature; //!< Signature
uint32_t version; //!< Version of GI file
uint32_t startX; //!< Left corner
uint32_t startY; //!< Top corner
uint32_t finishX; //!< Right corner
uint32_t finishY; //!< Bottom corner
uint32_t rBitmask; //!< Mask of r color component
uint32_t gBitmask; //!< Mask of g color component
uint32_t bBitmask; //!< Mask of b color component
uint32_t aBitmask; //!< Mask of a color component
uint32_t type; //!< Frame type
/*!<
* Variants:
* -# 0 - One layer, 16 or 32 bit, depends on mask.
* -# 1 - One layer, 16 bit RGB optimized.
* -# 2 - Three layers:
* -# 16 bit RGB optimized - body
* -# 16 bit RGB optimized - outline
* -# 6 bit Alpha optimized
* -# 3 - Two layers:
* -# Indexed RGB colors
* -# Indexed Alpha
* -# 4 - One layer, indexed RGBA colors
* -# 5 - Delta frame of GAI animation.
*/
uint32_t layerCount; //!< Number of layers in frame
uint32_t unknown1;
uint32_t unknown2;
uint32_t unknown3;
uint32_t unknown4;
};
например, если вам надо отпилить GIFrameHeader, а это 16 интов, то берете 16*4 байт = 64
static void Main(string[] args)
{
byte[] data = File.ReadAllBytes("2PirateSpecial2_00000.gi");
uint[] header = MemoryMarshal.Cast<byte, uint>(data[..64]).ToArray();
for (int i = 0; i < header.Length; i++)
{
Console.WriteLine(header[i]);
}
Console.ReadKey();
}
Вывод для вашего файла
26983 // signature
1 // version
0 // startX
23 // startY
176 // finishX
156 // finishY
63488 // rBitmask
2016 // gBitmask
31 // bBitmask
0 // aBitmask
2 // type
3 // layerCount
0 // reserved
0 // reserved
0 // reserved
0 // reserved
И далее в том же духе
Полезная информация и код чтения изображения я нагуглил здесь: https://github.com/ObKo/OpenSR/wiki/Original-Game-Resources---ru
Как работать с битмапами в библиотеке System.Drawing, я показывал здесь.