使用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 ...
随机推荐
- SQL-乐观锁,悲观锁之于并发
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...
- 定时往oracle插入数据
1创建存储过程 create or replace procedure job_proc isbegininsert into yy (yid) values (sysdate);end; 2创建jo ...
- js 点赞数 处理
likeNum(num) { if (num === 0) { num = ''; } else if (num > 9999 && num <= 9999999) { n ...
- Jquery入门指南教程
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka jQuery,顾名思义,也就是JavaScript和查询(Query),即是辅助JavaScr ...
- SQL2012新特性一次一个数据块----特殊的查询分页
对于数据库人员来说,在软件项目开发的过程中,或多或少的不可避免的就是经常遇到类似“UI查询结果设计”这样的说法,当听到UI设计的时候,多数人的第一反应是“靠!关我毛事!~这是其他人的问题!”. 然而, ...
- Python 时间和日期模块的常用例子
获取当前时间的两种方法 import datetime,time now = time.strftime("%Y-%m-%d %H:%M:%S") print now now = ...
- 批处理命令——set
[1]set命令简介 set,设置. [2]set命令使用 1. 打印系统环境变量.set命令可以打印系统所有的环境变量信息. 应用示例:新建文本文件,命名为set_sys,修改文件类型为bat,用N ...
- sublime设置备份
Settings-user { "font_face": "Consolas", "font_size": 13, "line_p ...
- Make div 100% height of browser window/设置div等于浏览器的高度
Viewport-Percentage (or Viewport-Relative) Lengths Viewport-Percentage Lengths: The viewport-percent ...
- javaScript实现修改输入框之后标红
<html> <title>实现标红</title> <script type="text/javascript"> functi ...