⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 miftobmp24.cpp

📁 3D Game Engine Design Source Code非常棒
💻 CPP
字号:
// Magic Software, Inc.
// http://www.magic-software.com
// http://www.wild-magic.com
// Copyright (c) 2003.  All Rights Reserved
//
// The Wild Magic Library (WML) source code is supplied under the terms of
// the license agreement http://www.magic-software.com/License/WildMagic.pdf
// and may not be copied or disclosed except in accordance with the terms of
// that agreement.

#include <windows.h>
#include "WmlCommand.h"
#include "WmlImage.h"
using namespace Wml;

#include <fstream>
using namespace std;

//----------------------------------------------------------------------------
static void SaveImage (const char* acFilename, int iWidth, int iHeight,
    unsigned char* aucData, int iSize)
{
    ofstream kOStr(acFilename,ios::out|ios::binary);
    if ( !kOStr )
        return;

    int iQuantity = iWidth*iHeight;
    int iDataBytes = iSize*iQuantity;

    // reverse byte order (Windows stores BGR (lowest byte to highest byte,
    // MIF stores RGB)
    unsigned char* aucRData = new unsigned char[iDataBytes];
    unsigned char* pucTmp = aucData;
    int i, i0, i1, i2, i3;

    if ( iSize == 3 )
    {
        for (i = 0, i0 = 0, i1 = 1, i2 = 2; i < iQuantity; i++)
        {
            aucRData[i0] = aucData[i2];
            aucRData[i1] = aucData[i1];
            aucRData[i2] = aucData[i0];
            i0 += 3;
            i1 += 3;
            i2 += 3;
        }
    }
    else
    {
        for (i = 0, i0 = 0, i1 = 1, i2 = 2, i3 = 3; i < iQuantity; i++)
        {
            aucRData[i0] = aucData[i2];
            aucRData[i1] = aucData[i1];
            aucRData[i2] = aucData[i0];
            aucRData[i3] = aucData[i3];
            i0 += 4;
            i1 += 4;
            i2 += 4;
            i3 += 4;
        }
    }

    BITMAPFILEHEADER kFileHeader;
    kFileHeader.bfType = 0x4d42;  // "BM"
    kFileHeader.bfSize =
        sizeof(BITMAPFILEHEADER) +
        sizeof(BITMAPINFOHEADER) +
        iDataBytes;
    kFileHeader.bfReserved1 = 0;
    kFileHeader.bfReserved2 = 0;
    kFileHeader.bfOffBits =
        sizeof(BITMAPFILEHEADER) +
        sizeof(BITMAPINFOHEADER);

    BITMAPINFOHEADER kInfoHeader;
    kInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
    kInfoHeader.biWidth = iWidth;
    kInfoHeader.biHeight = iHeight;
    kInfoHeader.biPlanes = 1;
    kInfoHeader.biBitCount = ( iSize == 3 ? 24 : 32 );
    kInfoHeader.biCompression = BI_RGB;
    kInfoHeader.biSizeImage = 0;
    kInfoHeader.biXPelsPerMeter = 0;
    kInfoHeader.biYPelsPerMeter = 0;
    kInfoHeader.biClrUsed = 0;
    kInfoHeader.biClrImportant = 0;

    kOStr.write((const char*)&kFileHeader,sizeof(BITMAPFILEHEADER));
    kOStr.write((const char*)&kInfoHeader,sizeof(BITMAPINFOHEADER));
    kOStr.write((const char*)aucRData,iDataBytes*sizeof(unsigned char));

    kOStr.close();

    delete[] aucRData;
}
//----------------------------------------------------------------------------
int main (int iArgQuantity, char** apcArgument)
{
    if ( iArgQuantity <= 1 )
        return -1;

    Command* pkCommand = new Command(iArgQuantity,apcArgument);
    if ( !pkCommand )
        return -2;

    char* acInputFile;
    pkCommand->Filename(acInputFile);
    if ( !acInputFile )
    {
        delete pkCommand;
        return -3;
    }

    char* acOutputFile;
    pkCommand->Filename(acOutputFile);
    if ( !acOutputFile )
    {
        delete pkCommand;
        delete[] acInputFile;
        return -4;
    }

    Image* pkImage = Image::Load(acInputFile);
    int iSize;
    switch ( pkImage->GetType() )
    {
    case Image::IT_RGB888:
        iSize = 3;
        break;
    case Image::IT_RGBA8888:
        iSize = 4;
        break;
    default:
        delete pkCommand;
        delete[] acInputFile;
        delete[] acOutputFile;
        delete pkImage;
        return -5;
    }

    SaveImage(acOutputFile,pkImage->GetWidth(),pkImage->GetHeight(),
        pkImage->GetData(),iSize);

    delete pkCommand;
    delete[] acInputFile;
    delete[] acOutputFile;
    delete pkImage;
    return 0;
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -