I was curious about it and ported an example
https://msdn.microsoft.com/en-us/library/windows/desktop/ee719871(v=vs.85).aspx#tiffencoding
Maybe it's interesting for someone.
Include file
Code: Select all
; >>> Constants <<<
Enumeration
#WICDecodeMetadataCacheOnDemand
#WICDecodeMetadataCacheOnLoad
EndEnumeration
Enumeration
#WICBitmapEncoderCacheInMemory
#WICBitmapEncoderCacheTempFile
#WICBitmapEncoderNoCache
EndEnumeration
Enumeration
#WICBitmapUseAlpha
#WICBitmapUsePremultipliedAlpha
#WICBitmapIgnoreAlpha
EndEnumeration
Enumeration
#WICBitmapPaletteTypeCustom
#WICBitmapPaletteTypeMedianCut
#WICBitmapPaletteTypeFixedBW
#WICBitmapPaletteTypeFixedHalftone8
#WICBitmapPaletteTypeFixedHalftone27
#WICBitmapPaletteTypeFixedHalftone64
#WICBitmapPaletteTypeFixedHalftone125
#WICBitmapPaletteTypeFixedHalftone216
#WICBitmapPaletteTypeFixedWebPalette = 7
#WICBitmapPaletteTypeFixedHalftone252
#WICBitmapPaletteTypeFixedHalftone256
#WICBitmapPaletteTypeFixedGray4
#WICBitmapPaletteTypeFixedGray16
#WICBitmapPaletteTypeFixedGray256
EndEnumeration
Enumeration
#WICBitmapDitherTypeNone
#WICBitmapDitherTypeSolid = 0
#WICBitmapDitherTypeOrdered4x4
#WICBitmapDitherTypeOrdered8x8
#WICBitmapDitherTypeOrdered16x16
#WICBitmapDitherTypeSpiral4x4
#WICBitmapDitherTypeSpiral8x8
#WICBitmapDitherTypeDualSpiral4x4
#WICBitmapDitherTypeDualSpiral8x8
#WICBitmapDitherTypeErrorDiffusion
EndEnumeration
Enumeration
#WICTiffCompressionDontCare
#WICTiffCompressionNone
#WICTiffCompressionCCITT3
#WICTiffCompressionCCITT4
#WICTiffCompressionLZW
#WICTiffCompressionRLE
#WICTiffCompressionZIP
#WICTiffCompressionLZWHDifferencing
EndEnumeration
; >>> Structures <<<
Structure PROPBAG2 Align #PB_Structure_AlignC
dwType.l
vt.u
cfType.u
dwHint.l
*pstrName
clsid.CLSID
EndStructure
; >>> Interfaces <<<
Interface IWICImagingFactory Extends IUnknown
CreateDecoderFromFilename(wzFilename.p-unicode, *pguidVendor, dwDesiredAccess, metadataOptions, *ppIDecoder)
CreateDecoderFromStream(*pIStream, *pguidVendor, metadataOptions, *ppIDecoder)
CreateDecoderFromFileHandle(hFile, *pguidVendor, metadataOptions, *ppIDecoder)
CreateComponentInfo(clsidComponent, *ppIInfo)
CreateDecoder(guidContainerFormat, *pguidVendor, *ppIDecoder)
CreateEncoder(guidContainerFormat, *pguidVendor, *ppIEncoder)
CreatePalette(*ppIPalette)
CreateFormatConverter(*ppIFormatConverter)
CreateBitmapScaler(*ppIBitmapScaler)
CreateBitmapClipper(*ppIBitmapClipper)
CreateBitmapFlipRotator(*ppIBitmapFlipRotator)
CreateStream(*ppIWICStream)
CreateColorContext(*ppIWICColorContext)
CreateColorTransformer(*ppIWICColorTransform)
CreateBitmap(uiWidth, uiHeight, pixelFormat, option, *ppIBitmap)
CreateBitmapFromSource(*piBitmapSource, option, *ppIBitmap)
CreateBitmapFromSourceRect(*piBitmapSource, x, y, width, height, *ppIBitmap)
CreateBitmapFromMemory(uiWidth, uiHeight, pixelFormat, cbStride, cbBufferSize, *pbBuffer, *ppIBitmap)
CreateBitmapFromHBITMAP(hBitmap, hPalette, options, *ppIBitmap)
CreateBitmapFromHICON(hIcon, *ppIBitmap)
CreateComponentEnumerator(componentTypes, options, *ppIEnumUnknown)
CreateFastMetadataEncoderFromDecoder(*pIDecoder, *ppIFastEncoder)
CreateFastMetadataEncoderFromFrameDecode(*pIFrameDecoder, *ppIFastEncoder)
CreateQueryWriter(guidMetadataFormat, *pguidVendor, *ppIQueryWriter)
CreateQueryWriterFromReader(*pIQueryReader, *pguidVendor, *ppIQueryWriter)
EndInterface
Interface IWICStream Extends IStream
InitializeFromIStream(Stream.IStream)
InitializeFromFilename(Filename.p-unicode, AccessMode.l)
InitializeFromMemory(*Buffer, BufferSize.l)
InitializeFromIStreamRegion(Stream.IStream, Offset.q, MaxSize.q)
EndInterface
Interface IWICBitmapSource Extends IUnknown
GetSize(*puiWidth, *puiHeight)
GetPixelFormat(*pPixelFormat)
GetResolution(*pDpiX, *pDpiY)
CopyPalette(*pIPalette)
CopyPixels(*prc, cbStride, cbBufferSize, *pbBuffer)
EndInterface
Interface IWICBitmap Extends IWICBitmapSource
Lock(*prcLock, flags, *ppILock)
SetPalette(*pIPalette)
SetResolution(dpiX.d, dpiY.d)
EndInterface
Interface IWICFormatConverter Extends IWICBitmapSource
Initialize(*pISource, dstFormat, dither, *pIPalette, alphaThresholdPercent.d, paletteTranslate)
CanConvert(srcPixelFormat, dstPixelFormat, *pfCanConvert)
EndInterface
Interface IWICPalette Extends IUnknown
InitializePredefined(ePaletteType, fAddTransparentColor)
InitializeCustom(*pColors, colorCount)
InitializeFromBitmap(*pISurface, colorCount, fAddTransparentColor)
InitializeFromPalette(*pIPalette)
GetType(*pePaletteType)
GetColorCount(*pcCount)
GetColors(colorCount, *pColors, *pcActualColors)
IsBlackWhite(*pfIsBlackWhite)
IsGrayscale(*pfIsGrayscale)
HasAlpha(*pfHasAlpha)
EndInterface
Interface IWICBitmapDecoder Extends IUnknown
QueryCapability(*pIStream, *pdwCapability)
Initialize(*pIStream, cacheOptions)
GetContainerFormat(*pguidContainerFormat)
GetDecoderInfo(*ppIDecoderInfo)
CopyPalette(*pIPalette)
GetMetadataQueryReader(*ppIMetadataQueryReader)
GetPreview(*ppIBitmapSource)
GetColorContexts(cCount, *ppIColorContexts, *pcActualCount)
GetThumbnail(*ppIThumbnail)
GetFrameCount(*pCount)
GetFrame(index, *ppIBitmapFrame)
EndInterface
Interface IWICBitmapEncoder Extends IUnknown
Initialize(*pIStream, cacheOption)
GetContainerFormat(*pguidContainerFormat)
GetEncoderInfo(*ppIEncoderInfo)
SetColorContexts(cCount, *ppIColorContext)
SetPalette(*pIPalette)
SetThumbnail(*pIThumbnail)
SetPreview(*pIPreview)
CreateNewFrame(*ppIFrameEncode, *ppIEncoderOptions)
Commit()
GetMetadataQueryWriter(*ppIMetadataQueryWriter)
EndInterface
Interface IWICBitmapFrameDecode Extends IWICBitmapSource
GetMetadataQueryReader(*ppIMetadataQueryReader)
GetColorContexts(cCount, *ppIColorContexts, *pcActualCount)
GetThumbnail(*ppIThumbnail)
EndInterface
Interface IWICBitmapFrameEncode Extends IUnknown
Initialize(*pIEncoderOptions)
SetSize(uiWidth, uiHeight)
SetResolution(dpiX.d, dpiY.d)
SetPixelFormat(*pPixelFormat)
SetColorContexts(cCount, *ppIColorContext)
SetPalette(*pIPalette)
SetThumbnail(*pIThumbnail)
WritePixels(lineCount, cbStride, cbBufferSize, *pbPixels)
WriteSource(*pIBitmapSource, *prc)
Commit()
GetMetadataQueryWriter(*ppIMetadataQueryWriter)
EndInterface
; >>> Imports <<<
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
Import ""
MakeBSTR(str.p-unicode) As "_SysAllocString"
EndImport
CompilerElse
Import ""
MakeBSTR(str.p-unicode) As "SysAllocString"
EndImport
CompilerEndIf
; >>> Macros <<<
Macro SafeRelease(obj)
If obj : obj\Release() : EndIf
EndMacro
Macro Define_ID(label,l1,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)
label:
!dd l1
!dw w1,w2
!db b1,b2,b3,b4,b5,b6,b7,b8
EndMacro
; >>> Data Section <<<
DataSection
Define_ID(CLSID_WICImagingFactory , 0xcacaf262, 0x9370, 0x4615, 0xa1, 0x3b, 0x9f, 0x55, 0x39, 0xda, 0x4c, 0x0a)
Define_ID(IID_IWICImagingFactory , 0xec5ec8a9, 0xc395, 0x4314, 0x9c, 0x77, 0x54, 0xd7, 0xa9, 0x35, 0xff, 0x70)
; Container formats
Define_ID(GUID_ContainerFormatAdng , 0xf3ff6d0d, 0x38c0, 0x41c4, 0xb1, 0xfe, 0x1f, 0x38, 0x24, 0xf1, 0x7b, 0x84)
Define_ID(GUID_ContainerFormatBmp , 0x0af1d87e, 0xfcfe, 0x4188, 0xbd, 0xeb, 0xa7, 0x90, 0x64, 0x71, 0xcb, 0xe3)
Define_ID(GUID_ContainerFormatPng , 0x1b7cfaf4, 0x713f, 0x473c, 0xbb, 0xcd, 0x61, 0x37, 0x42, 0x5f, 0xae, 0xaf)
Define_ID(GUID_ContainerFormatIco , 0xa3a860c4, 0x338f, 0x4c17, 0x91, 0x9a, 0xfb, 0xa4, 0xb5, 0x62, 0x8f, 0x21)
Define_ID(GUID_ContainerFormatJpeg , 0x19e4a5aa, 0x5662, 0x4fc5, 0xa0, 0xc0, 0x17, 0x58, 0x02, 0x8e, 0x10, 0x57)
Define_ID(GUID_ContainerFormatTiff , 0x163bcc30, 0xe2e9, 0x4f0b, 0x96, 0x1d, 0xa3, 0xe9, 0xfd, 0xb7, 0x88, 0xa3)
Define_ID(GUID_ContainerFormatGif , 0x1f8a5601, 0x7d4d, 0x4cbd, 0x9c, 0x82, 0x1b, 0xc8, 0xd4, 0xee, 0xb9, 0xa5)
Define_ID(GUID_ContainerFormatWmp , 0x57a37caa, 0x367a, 0x4540, 0x91, 0x6b, 0xf1, 0x83, 0xc5, 0x09, 0x3a, 0x4b)
; Pixel formats
Define_ID(GUID_WICPixelFormat8bppIndexed , 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x04)
Define_ID(GUID_WICPixelFormat8bppGray , 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x08)
Define_ID(GUID_WICPixelFormat24bppBGR , 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0c)
Define_ID(GUID_WICPixelFormat32bppBGRA , 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0f)
EndDataSection
Code: Select all
; >>> Ported example code <<<
Factory.IWICImagingFactory
Encoder.IWICBitmapEncoder
BitmapFrame.IWICBitmapFrameEncode
PropertyBag.IPropertyBag2
Stream.IWICStream
Width = 640
Height = 480
If CoInitializeEx_(0,2)&-2 = 0
uninit = #True
EndIf
hr = CoCreateInstance_(?CLSID_WICImagingFactory, #Null, #CLSCTX_INPROC_SERVER, ?IID_IWICImagingFactory, @Factory)
If hr = 0
hr = Factory\CreateStream(@Stream.IWICStream)
EndIf
If hr = 0
hr = Stream\InitializeFromFilename("output.tif", #GENERIC_WRITE)
EndIf
If hr = 0
hr = Factory\CreateEncoder(?GUID_ContainerFormatTiff, #Null, @Encoder.IWICBitmapEncoder)
EndIf
If hr = 0
hr = Encoder\Initialize(Stream, #WICBitmapEncoderNoCache)
EndIf
If hr = 0
Encoder\CreateNewFrame(@BitmapFrame.IWICBitmapFrameEncode, @PropertyBag.IPropertyBag2)
EndIf
If hr = 0
; This is how you customize the TIFF output.
Option.PROPBAG2
Option\pstrName = MakeBSTR("TiffCompressionMethod")
VarValue.VARIANT
VariantInit_(@VarValue)
VarValue\vt = #VT_UI1
VarValue\bVal = #WICTiffCompressionZIP
hr = PropertyBag\Write(1, @Option, @VarValue)
SysFreeString_(Option\pstrName)
If hr = 0
hr = BitmapFrame\Initialize(PropertyBag)
EndIf
EndIf
If hr = 0
hr = BitmapFrame\SetSize(Width, Height)
EndIf
CopyStructure(?GUID_WICPixelFormat24bppBGR, @FormatGUID.GUID, GUID)
If hr = 0
hr = BitmapFrame\SetPixelFormat(@FormatGUID)
EndIf
If hr = 0
; We're expecting to write out 24bppRGB. Fail if the encoder cannot do it.
hr = Bool(CompareMemory(@FormatGUID, ?GUID_WICPixelFormat24bppBGR, 16) = 0)
EndIf
If hr = 0
Stride = (Width * 24 + 7)/8;***WICGetStride***
BufferSize = Height * Stride
*Buffer = AllocateMemory(BufferSize)
*BufferPtr.Byte = *Buffer
If *Buffer <> #Null
For i = 0 To BufferSize - 1
*BufferPtr\b = Random(255)
*BufferPtr + 1
Next
hr = BitmapFrame\WritePixels(Height, Stride, BufferSize, *Buffer)
FreeMemory(*Buffer)
Else
hr = #E_OUTOFMEMORY
EndIf
EndIf
If hr = 0
hr = BitmapFrame\Commit()
EndIf
If hr = 0
hr = Encoder\Commit()
EndIf
If Factory
Factory\Release()
EndIf
If BitmapFrame
BitmapFrame\Release()
EndIf
If Encoder
Encoder\Release()
EndIf
If Stream
Stream\Release()
EndIf
If hr = 0
MessageRequester("TIFF encoding example", "TIFF file succesfully written")
Else
MessageRequester("TIFF encoding example", "An error has occured")
EndIf
If uninit
CoUninitialize_()
EndIf