C# работа с байтами изображения

Недавно начал изучать один древний игровой формат изображения.Из одной моей любимой игры(SpaceRangers HD).Хочу попробовать конвертировать его в современный формат png.

И так вот ближе к сути,как можно быстрее(в плане написания кода) читать файл преобразованный в массив байтов файл изображения,и можно ли подразбить скажем массив изображения на header и данные самого изображения для удобной работы?

Также я слышал что может помочь работа с буферами(так ли это)?


Ответы (1 шт):

Автор решения: aepot

Покажу кратко, вот структура заголовков 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, я показывал здесь.

→ Ссылка