使用WIC组件转换图片格式

#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;
}

使用WIC组件转换图片格式,布布扣,bubuko.com

时间: 2024-12-17 16:42:45

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

PDF文件格式转换攻略:PDF格式转换图片格式

关于PDF文件格式的转换大家有了解多少吗?就比如将PDF格式转换成图片格式,可能之前大家对于PDF件大家都有了解到,办公中我们经常遇到过.现在小编在这里教大家如何将PDF格式转换成图片格式,有兴趣的伙伴可以学着尝试一下! 1.操作之前可以将转换成图片格式的PDF文件另存到电脑桌面上,这样便于在后面的操作. 2.打开PDF转换器进入到操作的页面,在操作页面中可以选择到"PDF转成其他文件"栏目下的功能"文件转换图片",这一步完成之后,然后继续进行下一步操作.3.这时候

Windows如何打开heic 哪个软件可以转换图片格式

对于很多刚刚使用苹果手机的朋友应该都会有一个疑问,为什么我拍的照片在电脑上打不开,发给别人也打不开,是不是很多人会遇到这样的问题呢?答案毋庸置疑,其实对于苹果的老用户来说应该都是知道这是为什么的,对于新用户小编想说的是这是由于系统格式的不同导致的,苹果自iOS11系统之后默认的是heic图片格式,在电脑和安卓中都无法直接查看,需要将其格式转换成电脑或安卓可以兼容的图片格式,那Windows如何打开heic,哪个软件可以转换图片格式呢?1.想打开heic格式图片,要把格式转换一下,电脑可见的图片格

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

想用Mac电脑转换图片格式?我想你可以借助ImageWell for Mac软件!ImageWell是一款简单好用的的图像处理工具,具有显示,编辑,处理,保存等功能.下面小编来为大家演示在Mac电脑上使用ImageWell for Mac转换图片格式教程,希望对大家有所帮助! https://www.macdown.com ImageWell for Mac转换图片格式教程 ImageWell for Mac使用起来非常的方便,把图片拖进去就可以打开.接下来小编以酷狗音乐软件为例为大家演示转换图

利用PhotoShop批量压缩和转换图片格式

[摘要] 从单反相机中导出的照片,为保证照片质量,方便后期调整,摄影爱好者经常会在相机中将照片格式设置为.NEF,现在想转换为JPEG的格式,一张张处理太麻烦,有没有批量处理的方法?强大的PhotoShop可以帮我们自动搞定. [正文] NEF格式照片的调整方式 单反相机照相,为方便后期调整,可以将照片格式设置为NEF格式,这样如果以photoshop方式打开,自动就出现照片处理对话框,如图所示: 右边弹出的调整面板,可以方便调整曝光度和对比度等. 但如果想把照片放到手机内,或者处理好的照片希望

Ubuntu在命令行下面转换图片格式

尽管你可以使用GIMP来进行图纸格式的转换,但是操作还是有的麻烦.一个比较容易的方法是使用Imagemagick软件.安装完成以后,就可以 使用convert命令.convert命令非常简单,譬如: convert filename.jpg filename.bmp 如果你使用JPEG等大小和图片质量有关的图形格式化,可以使用-quality参数.参数的数值在0至100之间,数值越大文件越大,通 常情况下,60-80就可以了,譬如: convert -quality 80 filename.bm

java批量转换图片格式

废话不多直接上代码,代码其实也不多.... package com.qiao.testImage; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.imageio.ImageIO; public class imageChange { public

ImageMagick 转换图片格式

[[email protected]666 drawable-hdpi-v4]# convert ic_launcher.jpeg ic_launcher.png [[email protected]666 drawable-hdpi-v4]# file ic_launcher.png ic_launcher.png: PNG image data, 72 x 72, 8-bit/color RGB, non-interlaced [[email protected]666 drawable-h

bmp,jpg,png,tif,wmf,emf与eps图片格式转换

wmf/emf是两种Microsoft Windows的图形文件格式.它是一个矢量图格式,但是也允许包含位图.本质上,一个WMF文件保存一系列可以用来重建图片的Windows GDI命令.在某种程度上,它类似于印刷业广泛使用的PostScript格式. 关于wmf2eps安装使用的问题可参考如下两个网页. http://www.kellogg.northwestern.edu/rc/miktex-install.htm http://www.wolf-s.homepage.t-online.de

批量改变文件夹和子文件夹中图片格式的两种方法

生活中,我们通常会遇到这种问题:一个文件夹内部有多个子文件夹,每个文件夹内部有很多图片,我们想改变这些图片的格式. 例如.png格式图片支持背景透明,但我们想把它变成背景不透明的.jpg图片.又比如.bmp格式是非压缩图片,我们想把它转换为无损压缩的.png图片以节省存储空间. 如果图片数量很少,很明显我们可以通过Windows自带的画图工具或者其他看图软件通过“另存为”一张张地转换图片格式.但是如果图片很多,怎么办? 这个问题其实有两个关键点: ① 要求批量处理. ② 文件夹中还有子文件夹.