使用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;
}
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组件转换图片格式的更多相关文章
- 使用IMAGEMAGICK的CONVERT工具批量转换图片格式
使用IMAGEMAGICK的CONVERT工具批量转换图片格式 http://www.qiansw.com/linux-imagemagick-convert-img.html Home > 文 ...
- java批量转换图片格式
废话不多直接上代码,代码其实也不多.... package com.qiao.testImage; import java.awt.image.BufferedImage; import java.i ...
- Mac电脑如何转换图片格式?ImageWell for Mac转换图片格式教程
想用Mac电脑转换图片格式?我想你可以借助ImageWell for Mac软件!ImageWell是一款简单好用的的图像处理工具,具有显示,编辑,处理,保存等功能.下面小编来为大家演示在Mac电脑上 ...
- 【最简单】不用ps也可以批量转换图片格式
不废话直接开始~ 1.新建文件夹,把需要转换的图片放进去,如图: 2.文件夹里建一txt文本,重点来了!txt文本的内容,如果是jpg转为png,则输入“ren *.jpg *.png”,同理png转 ...
- ubuntu 转换图片格式的方法(sam2p, imagemagick)
(1) 终端:sudo apt-get install sam2p sam2p [原图片名.格式] [目标图片名.格式] 即可在同一目录下生成目标图片格式 (2) 终端: sudo apt-get i ...
- FreeImage库如何转换图片格式?
FreeImage下载地址:http://freeimage.sourceforge.net/ //freeimagemain.h #ifndef FREEIMAGEMAIN_H #define FR ...
- python转换图片格式
在图片所在的路径下,打开命令窗口 bmeps -c picturename.png picturename.eps
- 利用C#转换图片格式及转换为ico
注意:转换为ICO后效果不好. 源代码: using System;using System.Collections.Generic;using System.Text;using System.Dr ...
- ImageMagick 转换图片格式
[root@ drawable-hdpi-v4]# convert ic_launcher.jpeg ic_launcher.png [root@ drawable-hdpi-v4]# file ic ...
随机推荐
- Java 使用jaxp删除节点
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <perso ...
- 使用复合索引代替单键索引,来避免单键有null值的情况
查看原表: SQL> select count(*) from t1; COUNT(*) ---------- 3229088 SQL> select count(*) from t1 w ...
- 从零开始学Linux[二]:常用操作:用户组、进程、网络、ssh
摘要:Linux基础学习:创建用户组和用户.软件包管理.磁盘管理.进程管理.前后台进程的切换.网络配置.浏览网页.远程登录ssh 第一节,主要介绍一些简单命令,这节介绍一些日常操作. 1.创建用户组和 ...
- csuoj 1507: 超大型LED显示屏
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1507 1507: 超大型LED显示屏 时间限制: 1 Sec 内存限制: 128 MB 提交: ...
- RobotFrameWork http/https oauth接口测试 (二)
在RobotFrameWork http/https oauth接口测试 (一)中,大致介绍了相关的概念,终于可以步入正题了~~~ 先介绍下项目背景: 公司的项目采用的授权模式是第三种resource ...
- 使用匿名函数在回调函数中正确访问JS循环变量
有时候, 需要以不同的参数调用某个URL,并且在回调函数中仍然可以访问正在使用的参数, 这时候, 需要使用闭包保存当前参数, 否则, 当回调函数执行时, 之前的参数很可能早已被修改为最后一个参数了. ...
- Linux之netstat命令详解
简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Member ...
- Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现
接下篇:http://www.cnblogs.com/fuck1/p/5995857.html 堆栈的应用1:括号匹配算法 括号匹配问题 假设算术表达式中包含圆括号,方括号,和花括号三种类型.使用栈数 ...
- Linux C Programing - Arguments(2)
#include <iostream> #include <stdlib.h> #include <stdio.h> //printf #include <u ...
- 原生JS--Ajax
原生Ajax: Ajax基础:--ajax:无刷新数据读取,读取服务器上的信息--HTTP请求方法: --GET:用于获取数据,如浏览帖子 --POST:用于上传数据,如用户注册 --GE ...