gpt4 book ai didi

c++ - WIC 增加了 TIFF 图像的大小

转载 作者:行者123 更新时间:2023-11-28 05:48:44 27 4
gpt4 key购买 nike

场景:加载 TIFF 图像并提取 tiff 图像的帧并将其保存在本地。将提取的帧组合到输出 TIFF 图像中。当我尝试合并帧时,输出的 tiff 图像的大小急剧增加。例如,如果我的输入大小为 40 MB,则输出增加到 300 MB。下面是解释场景的代码,

    void readTiff()
{
HRESULT hr;
IWICBitmapFrameDecode *frameDecode = NULL;
IWICFormatConverter *formatConverter = NULL;
IWICBitmapEncoder *encoder = NULL;
IWICStream *pOutStream = NULL;
IWICBitmapFrameEncode *frameEncode = NULL;
IWICImagingFactory* m_pWICFactory;


hr = CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&m_pWICFactory)
);

IWICBitmapDecoder *pIDecoder = NULL;

hr = m_pWICFactory->CreateDecoderFromFilename(
L"D:\\test28\\Multitiff_files\\300dpiTIFF40MB_WATER.tif", // Image to be decoded
NULL, // Do not prefer a particular vendor
GENERIC_READ, // Desired read access to the file
WICDecodeMetadataCacheOnDemand, // Cache metadata when needed
&pIDecoder // Pointer to the decoder
);


UINT frameCount = 0;
pIDecoder->GetFrameCount(&frameCount);

for (int i = 0; i < frameCount; i++)
{
wchar_t temp[200];
int j = i;
swprintf_s(temp, 200, L"D:\\test28\\Multitiff_files\\out\\filename_png%d.jpeg", i);

if (SUCCEEDED(hr))
hr = m_pWICFactory->CreateStream(&pOutStream);
if (SUCCEEDED(hr))
hr = pOutStream->InitializeFromFilename(temp, GENERIC_WRITE);

if (SUCCEEDED(hr))
hr = m_pWICFactory->CreateEncoder(GUID_ContainerFormatJpeg, NULL, &encoder);
if (SUCCEEDED(hr))
hr = encoder->Initialize(pOutStream, WICBitmapEncoderNoCache);

hr = pIDecoder->GetFrame(i, &frameDecode);

if (SUCCEEDED(hr))
hr = m_pWICFactory->CreateFormatConverter(&formatConverter);

hr = formatConverter->Initialize(
frameDecode, // Source frame to convert
GUID_WICPixelFormat8bppIndexed, // The desired pixel format
WICBitmapDitherTypeNone, // The desired dither pattern
NULL, // The desired palette
0.f, // The desired alpha threshold
WICBitmapPaletteTypeMedianCut // Palette translation type
);
IPropertyBag2 *pPropertybag = NULL;
//Create a new frame..
hr = encoder->CreateNewFrame(&frameEncode, &pPropertybag);
//PROPBAG2 option = { 0 };
//option.pstrName = L"ImageQuality";
//VARIANT varValue;
//VariantInit(&varValue);
//varValue.vt = VT_R4;
//varValue.fltVal = 0.01f;
//hr = pPropertybag->Write(
// 1, // number of properties being set
// &option,
// &varValue);

WICPixelFormatGUID pixelFormat;
hr = frameEncode->Initialize(pPropertybag);

//pixelFormat = GUID_WICPixelFormat8bppIndexed;

frameDecode->GetPixelFormat(&pixelFormat);
hr = frameEncode->SetPixelFormat(&pixelFormat);

hr = frameEncode->WriteSource(formatConverter, NULL);
frameEncode->Commit();
encoder->Commit();

if (formatConverter)
formatConverter->Release();

if (frameDecode)
frameDecode->Release();

if (frameEncode)
frameEncode->Release();

if (pOutStream)
pOutStream->Release();

if (encoder)
encoder->Release();
}
if (m_pWICFactory)
m_pWICFactory->Release();

pIDecoder->Release();
}

void combineFile(int count)
{
HRESULT hr;
IWICImagingFactory *pFactory = NULL;
IWICStream *pInStream = NULL;
IWICBitmapDecoder *decoder = NULL;
IWICBitmapFrameDecode *frameDecode = NULL;
IWICFormatConverter *formatConverter = NULL;
IWICBitmapEncoder *encoder = NULL;
IWICStream *pOutStream = NULL;
IWICBitmapFrameEncode *frameEncode = NULL;

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

if (!SUCCEEDED(hr)) {
hr = CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, (LPVOID*)&pFactory);
}

if (SUCCEEDED(hr))
hr = pFactory->CreateStream(&pOutStream);

if (SUCCEEDED(hr))
hr = pOutStream->InitializeFromFilename(L"D:\\test28\\Multitiff_files\\out\\out.tiff", GENERIC_WRITE);
if (SUCCEEDED(hr))
hr = pFactory->CreateEncoder(GUID_ContainerFormatWmp, NULL, &encoder);
if (SUCCEEDED(hr))
hr = encoder->Initialize(pOutStream, WICBitmapEncoderNoCache);


for (int i = 0; i < count; i++)
{
wchar_t temp[200];

swprintf_s(temp, 200, L"D:\\test28\\Multitiff_files\\out\\filename_png%d.jpeg", i);
if (SUCCEEDED(hr))
hr = pFactory->CreateStream(&pInStream);
if (SUCCEEDED(hr))
hr = pInStream->InitializeFromFilename(temp, GENERIC_READ);
if (SUCCEEDED(hr))
hr = pFactory->CreateDecoderFromStream(pInStream, NULL, WICDecodeMetadataCacheOnLoad, &decoder);
if (SUCCEEDED(hr))
hr = pFactory->CreateFormatConverter(&formatConverter);


hr = decoder->GetFrame(0, &frameDecode);

//hr = formatConverter->Initialize(

// frameDecode, // Source frame to convert
// GUID_WICPixelFormat8bppIndexed, // The desired pixel format
// WICBitmapDitherTypeNone, // The desired dither pattern
// NULL, // The desired palette
// 0.f, // The desired alpha threshold
// WICBitmapPaletteTypeMedianCut // Palette translation type
// );

WICPixelFormatGUID pixelFormat;
frameDecode->GetPixelFormat(&pixelFormat);

IPropertyBag2 *pPropertybag = NULL;
//Create a new frame..
hr = encoder->CreateNewFrame(&frameEncode, &pPropertybag);
PROPBAG2 option = { 0 };
option.pstrName = L"TiffCompressionMethod";
VARIANT varValue;
VariantInit(&varValue);
varValue.vt = VT_UI1;
varValue.bVal = WICTiffCompressionOption::WICTiffCompressionZIP;
hr = pPropertybag->Write(1, &option, &varValue);


hr = frameEncode->Initialize(pPropertybag);
hr = frameEncode->SetPixelFormat(&pixelFormat);

hr = frameEncode->WriteSource(formatConverter, NULL);
hr = frameEncode->Commit();

if (pInStream)
pInStream->Release();
if (decoder)
decoder->Release();
if (formatConverter)
formatConverter->Release();
if (frameEncode)
frameEncode->Release();
//if (frameDecode)
//frameDecode->Release();
}
encoder->Commit();

if (pFactory)
pFactory->Release();

if (encoder)
encoder->Release();

if (pOutStream)
pOutStream->Release();
}

最佳答案

调试此类问题的一种简单方法是使用 ImageMagick,它安装在大多数 Linux 发行版上,并且适用于 OSX 和 Windows。首先使用套件中的 identify 实用程序及其 verbose 选项找出有关您的之前之后图像的所有信息像这样:

# Find out all we know about first image and put in file "1.txt"
identify -verbose image1.tif > 1.txt

# Find out all we know about second image and put in file "2.txt"
identify -verbose image2.tif > 2.txt

现在使用您最喜欢的文件比较工具来查看差异:

opendiff 1.txt 2.txt

enter image description here

关于c++ - WIC 增加了 TIFF 图像的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35715600/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com