#include <windows.h>
#include <Wincodec.h>

#pragma comment(lib, "Windowscodecs.lib" )

HRESULT PNG2WDP(WCHAR* szPngFileName, WCHAR* szWdpFileName)
{
    IWICImagingFactory *piFactory = NULL;

    IWICBitmapEncoder *piEncoder = NULL;
    IWICBitmapDecoder *piDecoder = NULL;

    IWICBitmapFrameEncode *piBitmapFrame = NULL;
    IWICBitmapFrameDecode *piBitmapFrameIn = NULL;

    IPropertyBag2 *pPropertybag = NULL;

    IWICStream *piStream = NULL;
    IWICStream *piStreamIn = NULL;

    UINT uiWidth = 0;
    UINT uiHeight = 0;
   
    ULONG counter = 0;

    CoInitialize(NULL);

    HRESULT hr = CoCreateInstance(
        CLSID_WICImagingFactory,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_IWICImagingFactory,
        (LPVOID*) &piFactory);

    if (SUCCEEDED(hr))
    {
        hr = piFactory->CreateStream(&piStream);
    }

    if (SUCCEEDED(hr))
    {
        hr = piStream->InitializeFromFilename(szWdpFileName, GENERIC_WRITE);
    }

    if (SUCCEEDED(hr))
    {
        hr = piFactory->CreateStream(&piStreamIn);
    }

    if (SUCCEEDED(hr))
    {
        hr = piStreamIn->InitializeFromFilename(szPngFileName, GENERIC_READ);
    }

    if (SUCCEEDED(hr))
    {
        hr = piFactory->CreateEncoder(GUID_ContainerFormatWmp, NULL, &piEncoder);
    }

    if (SUCCEEDED(hr))
    {
        hr = piEncoder->Initialize(piStream, WICBitmapEncoderNoCache);
    }

    if (SUCCEEDED(hr))
    {
        hr = piEncoder->CreateNewFrame(&piBitmapFrame, &pPropertybag);
    }

    if(SUCCEEDED(hr))
    {
        hr = piFactory->CreateDecoder(GUID_ContainerFormatPng, NULL, &piDecoder);
    }

    if (SUCCEEDED(hr))
    {
        hr = piDecoder->Initialize(piStreamIn, WICDecodeMetadataCacheOnDemand);
    }

    if(SUCCEEDED(hr))
    {
        hr = piDecoder->GetFrame(0, &piBitmapFrameIn);
    }

    if (SUCCEEDED(hr))
    {       
        // This is how you customize the TIFF output.
        PROPBAG2 option = { 0 };
        //option.pstrName = L"TiffCompressionMethod";
        //VARIANT varValue;   
        //VariantInit(&varValue);
        //varValue.vt = VT_UI1;
        //varValue.bVal = WICTiffCompressionZIP;     
        //hr = pPropertybag->Write(1, &option, &varValue);       
        if (SUCCEEDED(hr))
        {
            hr = piBitmapFrame->Initialize(pPropertybag);
        }
    }

    if (SUCCEEDED(hr))
    {
        hr = piBitmapFrameIn->GetSize(&uiWidth, &uiHeight);
        hr = piBitmapFrame->SetSize(uiWidth, uiHeight);
    }

    WICPixelFormatGUID formatGUID = GUID_WICPixelFormat32bppBGRA;
    if (SUCCEEDED(hr))
    {
        hr = piBitmapFrameIn->GetPixelFormat(&formatGUID);
        hr = piBitmapFrame->SetPixelFormat(&formatGUID);
    }

    if (SUCCEEDED(hr))
    {
        // We're expecting to write out 24bppRGB. Fail if the encoder cannot do it.
        hr = IsEqualGUID(formatGUID, GUID_WICPixelFormat32bppBGRA) ? S_OK : E_FAIL;
        if( FAILED(hr) )
        {
            hr = IsEqualGUID(formatGUID, GUID_WICPixelFormat24bppBGR) ? S_OK : E_FAIL;
        }
    }

    if (SUCCEEDED(hr))
    {           
        {
            IWICBitmap *pIBitmap = NULL;
            IWICBitmapLock *pILock = NULL;
           
            WICRect rcLock = { 0, 0, uiWidth, uiHeight };

            // Create the bitmap from the image frame.
            if (SUCCEEDED(hr))
            {
                hr = piFactory->CreateBitmapFromSource(
                    piBitmapFrameIn,          // Create a bitmap from the image frame
                    WICBitmapCacheOnDemand,  // Cache metadata when needed
                    &pIBitmap);              // Pointer to the bitmap
                hr = pIBitmap->Lock(&rcLock, WICBitmapLockWrite, &pILock);
               
                BYTE *pv = NULL;
                UINT cbStride = 0;
                UINT cbBufferSize = 0;

                // Retrieve a pointer to the pixel data.
                if (SUCCEEDED(hr))
                {
                    hr = pILock->GetDataPointer(&cbBufferSize, &pv);
                }
                cbStride = cbBufferSize / uiHeight;
                hr = piBitmapFrame->WritePixels(uiHeight, cbStride, cbBufferSize, pv);

                counter = pILock->Release();
                counter = pIBitmap->Release();

                pv = NULL;
            }           
        }
    //    else
        {
    //        hr = E_OUTOFMEMORY;
        }
    }

    if (SUCCEEDED(hr))
    {
        hr = piBitmapFrame->Commit();
    }   

    if (SUCCEEDED(hr))
    {
        hr = piEncoder->Commit();
    }

    if (piFactory)
        counter = piFactory->Release();

    if (piBitmapFrame)
        counter = piBitmapFrame->Release();

    if(piBitmapFrameIn)
        counter = piBitmapFrameIn->Release();
   
    if(piDecoder)
        counter = piDecoder->Release();

    if (piEncoder)
        counter = piEncoder->Release();

    if (piStream)
        counter = piStream->Release();

    if(piStreamIn)
        counter = piStreamIn->Release();

    if( pPropertybag )
        counter = pPropertybag->Release();

    CoUninitialize();
    return hr;
}

bool IsRGBA(const std::wstring& strFileName)
{
    unsigned char buf[4] = {0};
    std::fstream fs(strFileName, std::ios::in | std::ios::binary);
    fs.seekg(4, SEEK_SET);
    fs.read((char*)&buf, 4);
    int pos = (buf[3] << 24) + (buf[2] << 16) + (buf[1] << 8) + buf[0];
    while( pos > 0 )
    {
        fs.seekg(pos, SEEK_SET);
        fs.read((char*)&buf, 2);
        int numEntry = (buf[1] << 8) + buf[0];
        fs.seekg(12 * numEntry, SEEK_CUR);
        fs.read((char*)&buf, 4);
        pos = (buf[3] << 24) + (buf[2] << 16) + (buf[1] << 8) + buf[0];
    }
    fs.seekg(15, SEEK_CUR);
    fs.read((char*)&buf, 1);
    if( buf[0] == 0x0F )
        return true;
    else
        return false;
}

使用WIC组件转换图片格式的更多相关文章

  1. 使用IMAGEMAGICK的CONVERT工具批量转换图片格式

    使用IMAGEMAGICK的CONVERT工具批量转换图片格式 http://www.qiansw.com/linux-imagemagick-convert-img.html Home > 文 ...

  2. java批量转换图片格式

    废话不多直接上代码,代码其实也不多.... package com.qiao.testImage; import java.awt.image.BufferedImage; import java.i ...

  3. Mac电脑如何转换图片格式?ImageWell for Mac转换图片格式教程

    想用Mac电脑转换图片格式?我想你可以借助ImageWell for Mac软件!ImageWell是一款简单好用的的图像处理工具,具有显示,编辑,处理,保存等功能.下面小编来为大家演示在Mac电脑上 ...

  4. 【最简单】不用ps也可以批量转换图片格式

    不废话直接开始~ 1.新建文件夹,把需要转换的图片放进去,如图: 2.文件夹里建一txt文本,重点来了!txt文本的内容,如果是jpg转为png,则输入“ren *.jpg *.png”,同理png转 ...

  5. ubuntu 转换图片格式的方法(sam2p, imagemagick)

    (1) 终端:sudo apt-get install sam2p sam2p [原图片名.格式] [目标图片名.格式] 即可在同一目录下生成目标图片格式 (2) 终端: sudo apt-get i ...

  6. FreeImage库如何转换图片格式?

    FreeImage下载地址:http://freeimage.sourceforge.net/ //freeimagemain.h #ifndef FREEIMAGEMAIN_H #define FR ...

  7. python转换图片格式

    在图片所在的路径下,打开命令窗口 bmeps -c picturename.png picturename.eps

  8. 利用C#转换图片格式及转换为ico

    注意:转换为ICO后效果不好. 源代码: using System;using System.Collections.Generic;using System.Text;using System.Dr ...

  9. ImageMagick 转换图片格式

    [root@ drawable-hdpi-v4]# convert ic_launcher.jpeg ic_launcher.png [root@ drawable-hdpi-v4]# file ic ...

随机推荐

  1. 【转】HTTP 头部解释,HTTP 头部详细分析,最全HTTP头部信息

    HTTP 头部解释 ========================================================================================== ...

  2. PinPhoto On OS X

    把多张图片摆放到屏幕任何位置并保存成文件,下次打开时恢复之前的状态! 一般使用场景: 经常要看的图片,比如说软件快捷键.库的API.英文生词.常用配色等等摆好在屏幕上以便查看和记忆. 用PS等画画.设 ...

  3. MVC控制器获取@Html.DropDownList值

    MVC控制器获取@Html.DropDownList值 发表于 2014 年 4 月 1 日 作者 efour — 暂无评论 先贴一段代码,演示@Html.DropDownList的使用. 前台 前台 ...

  4. AngularJS基础概要整理(下)

    五.AngularJS Scope(作用域) Scope(作用域)是应用在HTML(视图)和JavaScript(控制器)之间的纽带. Scope是一个对象,有可用的方法和属性. Scope可应用在视 ...

  5. Oracle常用操作-----(二)

    Oracle主要类型函数: 单行函数:只能输入一行结果,返回一个结果.常见的单行函数有: 字符函数 数字函数 转换函数 日期函数 2.聚合函数:同时可以对多行数据进行操作,并返回一个结果.(AVG.S ...

  6. Java关于md5+salt盐加密验证

    一.陈述一下工作流程: 1.根据已有的密码字符串去生成一个密码+盐字符串,可以将盐的加密字符串也存放在数据库(看需求), 2.验证时将提交的密码字符串进行同样的加密再从数据库中取得已有的盐进行组合密码 ...

  7. 【01:转自知乎:关于 openSUSE 】

    我是 openSUSE 中文维基唯一的非官方维护者,openSUSE 简体中文翻译团队召集人,linuxsir SuSE 版块的版主,openSUSE 官方论坛 http://forums.opens ...

  8. 【final】站立会议---11.28

    名称:nice! 组长:李权 成员:韩媛媛 刘芳芳 宫丽君 于淼 项目名称:约跑app 时间:11月28日 12:30 内容: 新任务的分配 1.李权分配任务 2.韩媛媛写站立会议 3.刘芳芳修改BU ...

  9. asp.net 分页-自己写分页控件

    去年就发表过asp.net 分页-利用后台直接生成html分页 ,那种方法只是单纯的实现了分页,基本不能使用,那时就想写个自己的分页控件,无奈能力有限.最近有点时间了,就自己做出了这个分页控件.我承认 ...

  10. FusionCharts或其它flash的div图层总是浮在最上层的问题

    div的图层由div的style中的z-index来决定,z-index是层垂直屏幕的坐标,0最小,越大的话位置越靠上. 由于FusionCharts的图表都放在div中,如果页面还有其他的div,将 ...