Code Block
int main(int argc, CHAR* argv[])
{
//Initialize COM.
CoInitialize(NULL);
////////////////////////////////////////////////////////////////////////////
//part1
//Create a WIC Decoder
////////////////////////////////////////////////////////////////////////////
IWICImagingFactory *piFactory = NULL;
IWICBitmapDecoder *piDecoder = NULL;
//Create the COM imaging factory.
HRESULT hr = CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWICImagingFactory,
(LPVOID*)&piFactory);
//Create the decoder.
if (SUCCEEDED(hr))
{
hr = piFactory->CreateDecoderFromFilename(
L"test_raw.cr2",
NULL,
GENERIC_READ,
WICDecodeMetadataCacheOnDemand, //For JPEG lossless decoding/encoding.
&piDecoder);
}
////////////////////////////////////////////////////////////////////////////
//part2
//Create a WIC Encoder
//to encode the new image
////////////////////////////////////////////////////////////////////////////
//Variables used for encoding.
IWICStream *piFileStream = NULL;
IWICBitmapEncoder *piEncoder = NULL;
IWICMetadataBlockWriter *piBlockWriter = NULL;
IWICMetadataBlockReader *piBlockReader = NULL;
PROPVARIANT value;
WICPixelFormatGUID pixelFormat = { 0 };
UINT count = 0;
double dpiX=0, dpiY = 0.0;
UINT width=0, height = 0;
//Initialize PROPVARIANT
PropVariantInit(&value);
// Create a file stream.
if (SUCCEEDED(hr))
{
hr = piFactory->CreateStream(&piFileStream);
}
// Initialize our new file stream.
if (SUCCEEDED(hr))
{
hr = piFileStream->InitializeFromFilename(L"test2.tiff", GENERIC_WRITE);
}
// Create the encoder.
if (SUCCEEDED(hr))
{
hr = piFactory->CreateEncoder(GUID_ContainerFormatTiff, NULL, &piEncoder);
}
// Initialize the encoder
if (SUCCEEDED(hr))
{
hr = piEncoder->Initialize(piFileStream,WICBitmapEncoderNoCache);
}
////////////////////////////////////////////////////////////////////////////
//part3
//Copy Decoded Frame Information
////////////////////////////////////////////////////////////////////////////
if (SUCCEEDED(hr))
{
piDecoder->GetFrameCount(&count);
}
//Process each frame of the image.
for (UINT i=0; i<count && SUCCEEDED(hr); i++)
{
//Frame variables.
IWICBitmapFrameDecode *piFrameDecode = NULL;
IWICBitmapFrameEncode *piFrameEncode = NULL;
IWICMetadataQueryReader *piFrameQReader = NULL;
IWICMetadataQueryWriter *piFrameQWriter = NULL;
//Get and create image frame.
if (SUCCEEDED(hr))
{
hr = piDecoder->GetFrame(i, &piFrameDecode);
}
if (SUCCEEDED(hr))
{
hr = piEncoder->CreateNewFrame(&piFrameEncode, NULL);
}
//Initialize the encoder.
if (SUCCEEDED(hr))
{
hr = piFrameEncode->Initialize(NULL);
}
//Get and set size.
if (SUCCEEDED(hr))
{
piFrameDecode->GetSize(&width, &height);
}
if (SUCCEEDED(hr))
{
hr = piFrameEncode->SetSize(width, height);
}
//Get and set resolution.
if (SUCCEEDED(hr))
{
piFrameDecode->GetResolution(&dpiX, &dpiY);
}
if (SUCCEEDED(hr))
{
hr = piFrameEncode->SetResolution(dpiX, dpiY);
}
//Set pixel format.
if (SUCCEEDED(hr))
{
piFrameDecode->GetPixelFormat(&pixelFormat);
}
if (SUCCEEDED(hr))
{
hr = piFrameEncode->SetPixelFormat(&pixelFormat);
}
////////////////////////////////////////////////////////////////////////////
//part3
//Finalize the Encoded Image
////////////////////////////////////////////////////////////////////////////
// To get cbStride, create IWICBitmapSource, IWICBitmap and IWICBitmapLock.
IWICBitmapSource *piBitmapSource = NULL;
IWICBitmap *piBitmap = NULL;
IWICBitmapLock *piBitmapLock = NULL;
WICRect prc = {0,0,width,height};
UINT cbStride = 0;
piBitmapSource = static_cast<IWICBitmapSource*>(piFrameDecode);
piBitmapSource->GetSize(&width, &height);
hr = piFactory->CreateBitmapFromSource(piBitmapSource, WICBitmapCacheOnLoad, &piBitmap);
hr = piBitmap->Lock(&prc, WICBitmapLockWrite, &piBitmapLock);
// Get Stride!!
// In (*.cr2) case, the function returns 'width * 6', [6 byte / pixel] as cbStride.
// it means each RGB channel has 2 Byte(16bit).
hr = piBitmapLock->GetStride(&cbStride);
UINT cbBufferSize = height * cbStride;
BYTE *pbBuffer = new BYTE[cbBufferSize];
piBitmapSource->CopyPixels(&prc, cbStride, cbBufferSize, pbBuffer);
piBitmap->Release();
////////////////////////////////////////////////////////////////////////////////////////////////
// how to convert each RGB channel value(2 Byte) to float or something..
///////////////////////////////////////////////////////////////////////////////////////////////
INT *tmp = new INT[cbBufferSize];
for(UINT i=0;i<cbBufferSize;i++){
tmp[i] = static_cast<INT>(pbBuffer[i]);
}
////////////////////////////////////////////////////////////////////////////////////////////////
if (SUCCEEDED(hr))
{
hr = piFrameEncode->WritePixels(height, cbStride, cbBufferSize, pbBuffer);
}
//Commit the frame.
if (SUCCEEDED(hr))
{
hr = piFrameEncode->Commit();
}
}
if (SUCCEEDED(hr))
{
piEncoder->Commit();
}
if (SUCCEEDED(hr))
{
//piFileStream->Commit();
}
Cleanup:
if (piFileStream)
piFileStream->Release();
if (piEncoder)
piEncoder->Release();
if (piBlockWriter)
piBlockWriter->Release();
if (piBlockReader)
piBlockReader->Release();
return 0;
}