QImage Encoder

PageListMacroPatternTemplatePlayMacroPocketSubwayPostIT QImageEncoder

QImageEncoder

GDI+ // MFC

@QImageEncoder.zip (1.65 KB) (새이름으로 저장)
#pragma once

// QImageEncoder
//
// Encapsulation of GDI+ GetImageEncoders() function, used to save an Image.
// Use at your own risk. Comments welcome.
//
// Version 1.0 (c) 2003, Sjaak Priester, Amsterdam.
// mailto:sjaak@sjaakpriester.nl

class QImageEncoder
{
public:
        QImageEncoder(LPCTSTR s);
        ~QImageEncoder(void);
protected:
        CLSID m_Clsid;
        bool m_bStatus;
        CString m_MimeType;
public:
        Status Save(Image * pImage, LPCTSTR pPath);
        long m_Quality;
        int m_Compression;
};


// QImageEncoder
//
// Encapsulation of GDI+ GetImageEncoders() function, used to save an Image.
// Use at your own risk. Comments welcome.
//
// Version 1.0 (c) 2003, Sjaak Priester, Amsterdam.
// mailto:sjaak@sjaakpriester.nl

#include "stdafx.h"
#include "QImageEncoder.h"

// QImageEncoder can be constructed from file path or from mime type
QImageEncoder::QImageEncoder(LPCTSTR s)
: m_Quality(100)
, m_Compression(EncoderValueCompressionLZW)
{
        m_bStatus = false;

        CString sPath(s);
        sPath.MakeLower();
        int dot = sPath.ReverseFind(_T('.'));
        if (dot > -1) sPath = _T("*") + sPath.Right(sPath.GetLength() - dot);

        UINT count = 0;
        UINT size = 0;

        if (GetImageEncodersSize(& count, & size) != Ok) return;

        BYTE * pBytes = new BYTE[size];
        if (! pBytes) return;

        ImageCodecInfo * pInfo = (ImageCodecInfo *) pBytes;

        if (GetImageEncoders(count, size, pInfo) != Ok) return;

        for (UINT i = 0; i < count; i++)
        {
                CString sExt(pInfo->FilenameExtension);
                sExt.MakeLower();

                CString sMime(pInfo->MimeType);
                sMime.MakeLower();

                if (sMime == sPath || sExt.Find(sPath) >= 0)
                {
                m_Clsid = pInfo->Clsid;
                        m_MimeType = sMime;
                        break;
                }
                pInfo++;
        }
        delete[] pBytes;
        m_bStatus = (i < count);
}

QImageEncoder::~QImageEncoder(void)
{
}

Status QImageEncoder::Save(Image * pImage, LPCTSTR pPath)
{
        if (! m_bStatus) return GenericError;

        CString s(pPath);

        EncoderParameters params;
        EncoderParameters * pParams = NULL;

        params.Count = 1;
        params.Parameter[0].Type = EncoderParameterValueTypeLong;
        params.Parameter[0].NumberOfValues = 1;

        if (m_MimeType == _T("image/jpeg"))
        {
                pParams = & params;
                params.Parameter[0].Guid = EncoderQuality;
                params.Parameter[0].Value = & m_Quality;
        }
        else if (m_MimeType == _T("image/tiff"))
        {
                // With GDI+ 1.0, EncoderValueCompressionLZW and EncoderValueCompressionNone
                // are the only values that work. EncoderValueCompressionCCITT3, -CCITT4, and -Rle
                // always let fail a save operation with a InvalidParameter error.
                // (Could it be that they only work with monochrome bitmaps?)
                // Because of that, for the time being we leave m_Compression at
                // EncoderValueCompressionLZW. As this is also the default, we might as well
                // refrain from setting the parameter alltogether. But we leave the code, as it
                // probably doesn't hurt.
                pParams = & params;
                params.Parameter[0].Guid = EncoderCompression;
                params.Parameter[0].Value = & m_Compression;
        }

        return pImage->Save(s.AllocSysString(), & m_Clsid, pParams);
}


ID
Password
Join





- 전 이런 놈입니다.

격언> 게으른 행동에 대해 하늘이 주는 벌은 두 가지다. 하나는 자신의 실패요, 또 다른 하나는 그가 하지 않은 일을 해낸 옆 사람의 성공이다. (르나르)

Recent Changes

D  Echoes Of War(The... @ 2012-05-18 [03:44 pm] by windlesszone
D  Diablo3 @ 2012-05-15 [04:49 pm] by windlesszone
D  Diablo3/story/wizard @ 2012-05-15 [04:48 pm] by windlesszone 4 changes
D  Diablo3/story/wit... @ 2012-05-15 [04:16 pm] by windlesszone
D  Diablo3/story/monk @ 2012-05-15 [04:14 pm] by windlesszone





Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-04-03 13:23:21
Processing time 0.1146 sec