Search code examples
delphicomdelphi-2007jpegbmp

Delphi 2007 using Windows Imaging Component (WIC)


I need to read and convert some pictures around 1.7mb from jpg to bmp in Delphi 2007.

Some pictures are cut out, grayscale or worst after conversion.

I searched, but in no way i found a trick to add WIC routines like TWicImage in delphi 2007.

I read somewhere that it can be easily added via COM, but I do not know how or what file has to be imported.

Thank you.


Solution

  • Here is an example how to convert JPEG to bitmap using WIC:

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      StdCtrls, Dialogs, ComObj, ActiveX;
    
    const
      WICBitmapCacheOnLoad = $2;
      WICDecodeMetadataCacheOnDemand = 0;
    
      SID_IPropertyBag2 = '{22F55882-280B-11d0-A8A9-00A0C90C2004}';
      SID_IWICComponentInfo = '{23BC3F0A-698B-4357-886B-F24D50671334}';
      SID_IWICBitmapSource = '{00000120-a8f2-4877-ba0a-fd2b6645fb94}';
      SID_IWICBitmap = '{00000121-a8f2-4877-ba0a-fd2b6645fb94}';
      SID_IWICBitmapLock = '{00000123-a8f2-4877-ba0a-fd2b6645fb94}';
      SID_IWICBitmapCodecInfo = '{E87A44C4-B76E-4c47-8B09-298EB12A2714}';
      SID_IWICBitmapEncoder = '{00000103-a8f2-4877-ba0a-fd2b6645fb94}';
      SID_IWICBitmapDecoder = '{9EDDE9E7-8DEE-47ea-99DF-E6FAF2ED44BF}';
      SID_IWICBitmapEncoderInfo = '{94C9B4EE-A09F-4f92-8A1E-4A9BCE7E76FB}';
      SID_IWICBitmapDecoderInfo = '{D8CD007F-D08F-4191-9BFC-236EA7F0E4B5}';
      SID_IWICBitmapFrameEncode = '{00000105-a8f2-4877-ba0a-fd2b6645fb94}';
      SID_IWICBitmapFrameDecode = '{3B16811B-6A43-4ec9-A813-3D930C13B940}';
      SID_IWICBitmapScaler = '{00000302-a8f2-4877-ba0a-fd2b6645fb94}';
      SID_IWICBitmapClipper = '{E4FBCF03-223D-4e81-9333-D635556DD1B5}';
      SID_IWICBitmapFlipRotator = '{5009834F-2D6A-41ce-9E1B-17C5AFF7A782}';
      SID_IWICPalette = '{00000040-a8f2-4877-ba0a-fd2b6645fb94}';
      SID_IWICColorContext = '{3C613A02-34B2-44ea-9A7C-45AEA9C6FD6D}';
      SID_IWICColorTransform = '{B66F034F-D0E2-40ab-B436-6DE39E321A94}';
      SID_IWICMetadataQueryReader = '{30989668-E1C9-4597-B395-458EEDB808DF}';
      SID_IWICMetadataQueryWriter = '{A721791A-0DEF-4d06-BD91-2118BF1DB10B}';
      SID_IWICFastMetadataEncoder = '{B84E2C09-78C9-4AC4-8BD3-524AE1663A2F}';
      SID_IWICStream = '{135FF860-22B7-4ddf-B0F6-218F4F299A43}';
      SID_IWICFormatConverter = '{00000301-a8f2-4877-ba0a-fd2b6645fb94}';
      SID_IWICImagingFactory = '{ec5ec8a9-c395-4314-9c77-54d7a935ff70}';
      CLSID_WICImagingFactory: TGUID = '{CACAF262-9370-4615-A13B-9F5539DA4C0A}';
      GUID_WICPixelFormat32bppBGRA: TGUID = '{6FDDC324-4E03-4BFE-B185-3D77768DC90F}';
    
    type
      PWICColor = ^TWicColor;
      TWICColor = Cardinal;
      PWICRect = ^TWICRect;
      TWICRect = record
        X: Integer;
        Y: Integer;
        Width: Integer;
        Height: Integer;
      end;
      PIWICColorContext = ^IWICColorContext;
      PWICBitmapPattern = ^TWICBitmapPattern;
      TWICBitmapPattern = record
        Position: ULARGE_INTEGER;
        Length: ULONG;
        Pattern: PByte;
        Mask: PByte;
        EndOfStream: BOOL;
      end;
      PPropBag2 = ^TPropBag2;
      TPropBag2 = record
        dwType: DWORD;
        vt: TVarType;
        cfType: TClipFormat;
        dwHint: DWORD;
        pstrName: POleStr;
        clsid: TCLSID;
      end;
      TWICInProcPointer = ^Byte;
      TWICPixelFormatGUID = TGUID;
      TREFWICPixelFormatGUID = PGUID;
      TWICComponentType = type Integer;
      TWICDecodeOptions = type Integer;
      TWICColorContextType = type Integer;
      TWICBitmapDitherType = type Integer;
      TWICBitmapPaletteType = type Integer;
      TWICBitmapInterpolationMode = type Integer;
      TWICBitmapEncoderCacheOption = type Integer;
      TWICBitmapTransformOptions = type Integer;
      TWICBitmapCreateCacheOption = type Integer;
      TWICBitmapAlphaChannelOption = type Integer;
    
      IPropertyBag2 = interface;
      IWICPalette = interface;
      IWICColorContext = interface;
      IWICColorTransform = interface;
      IWICBitmap = interface;
      IWICBitmapLock = interface;
      IWICBitmapSource = interface;
      IWICBitmapCodecInfo = interface;
      IWICBitmapEncoder = interface;
      IWICBitmapDecoder = interface;
      IWICBitmapEncoderInfo = interface;
      IWICBitmapDecoderInfo = interface;
      IWICBitmapFrameEncode = interface;
      IWICBitmapFrameDecode = interface;
      IWICBitmapScaler = interface;
      IWICBitmapClipper = interface;
      IWICBitmapFlipRotator = interface;
      IWICMetadataQueryReader = interface;
      IWICMetadataQueryWriter = interface;
      IWICFastMetadataEncoder = interface;
      IWICStream = interface;
      IWICComponentInfo = interface;
      IWICFormatConverter = interface;
      IWICImagingFactory = interface;
    
      IPropertyBag2 = interface(IUnknown)
        [SID_IPropertyBag2]
        function Read(pPropBag: PPropBag2; pErrLog: IErrorLog; pvarValue: PVariant; phrError: PHResult): HRESULT; stdcall;
        function Write(cProperties: ULONG; pPropBag: PPropBag2; pvarValue: PVariant): HRESULT; stdcall;
        function CountProperties(var pcProperties: ULONG): HRESULT; stdcall;
        function GetPropertyInfo(iProperty, cProperties: ULONG; pPropBag: PPropBag2; var pcProperties: ULONG): HRESULT; stdcall;
        function LoadObject(pstrName:POleStr; dwHint: DWORD; pUnkObject: IUnknown; pErrLog: IErrorLog): HRESULT; stdcall;
      end;
      IWICComponentInfo = interface(IUnknown)
        [SID_IWICComponentInfo]
        function GetComponentType(var pType: TWICComponentType): HRESULT; stdcall;
        function GetCLSID(var pclsid: TGUID): HRESULT; stdcall;
        function GetSigningStatus(var pStatus: DWORD): HRESULT; stdcall;
        function GetAuthor(cchAuthor: UINT; wzAuthor: PWCHAR; var pcchActual: UINT): HRESULT; stdcall;
        function GetVendorGUID(var pguidVendor: TGUID): HRESULT; stdcall;
        function GetVersion(cchVersion: UINT; wzVersion: PWCHAR; var pcchActual: UINT): HRESULT; stdcall;
        function GetSpecVersion(cchSpecVersion: UINT; wzSpecVersion: PWCHAR; var pcchActual: UINT): HRESULT; stdcall;
        function GetFriendlyName(cchFriendlyName: UINT; wzFriendlyName: PWCHAR; var pcchActual: UINT): HRESULT; stdcall;
      end;
      IWICBitmapSource = interface(IUnknown)
        [SID_IWICBitmapSource]
        function GetSize(var puiWidth: UINT; var puiHeight: UINT): HRESULT; stdcall;
        function GetPixelFormat(var pPixelFormat: TWICPixelFormatGUID): HRESULT; stdcall;
        function GetResolution(var pDpiX: Double; var pDpiY: Double): HRESULT; stdcall;
        function CopyPalette(pIPalette: IWICPalette): HRESULT; stdcall;
        function CopyPixels(prc: PWICRect; cbStride: UINT; cbBufferSize: UINT; pbBuffer: PByte): HRESULT; stdcall;
      end;
      IWICBitmap = interface(IWICBitmapSource)
        [SID_IWICBitmap]
        function Lock(const prcLock: TWICRect; flags: DWORD; out ppILock: IWICBitmapLock): HRESULT; stdcall;
        function SetPalette(pIPalette: IWICPalette): HRESULT; stdcall;
        function SetResolution(dpiX: Double; dpiY: Double): HRESULT; stdcall;
      end;
      IWICBitmapLock = interface(IUnknown)
        [SID_IWICBitmapLock]
        function GetSize(var puiWidth: UINT; var puiHeight: UINT): HRESULT; stdcall;
        function GetStride(var pcbStride: UINT): HRESULT; stdcall;
        function GetDataPointer(var pcbBufferSize: UINT; var ppbData: TWICInProcPointer): HRESULT; stdcall;
        function GetPixelFormat(var pPixelFormat: TWICPixelFormatGUID): HRESULT; stdcall;
      end;
      IWICBitmapCodecInfo = interface(IWICComponentInfo)
        [SID_IWICBitmapCodecInfo]
        function GetContainerFormat(var pguidContainerFormat: TGUID): HRESULT; stdcall;
        function GetPixelFormats(cFormats: UINT; var guidPixelFormats: PGUID; var pcActual: UINT): HRESULT; stdcall;
        function GetColorManagementVersion(cchColorManagementVersion: UINT; wzColorManagementVersion: PWCHAR; var pcchActual: UINT): HRESULT; stdcall;
        function GetDeviceManufacturer(cchDeviceManufacturer: UINT; wzDeviceManufacturer: PWCHAR; var pcchActual: UINT): HRESULT; stdcall;
        function GetDeviceModels(cchDeviceModels: UINT; wzDeviceModels: PWCHAR; var pcchActual: UINT): HRESULT; stdcall;
        function GetMimeTypes(cchMimeTypes: UINT; wzMimeTypes: PWCHAR; var pcchActual: UINT): HRESULT; stdcall;
        function GetFileExtensions(cchFileExtensions: UINT; wzFileExtensions: PWCHAR; var pcchActual: UINT): HRESULT; stdcall;
        function DoesSupportAnimation(var pfSupportAnimation: BOOL): HRESULT; stdcall;
        function DoesSupportChromakey(var pfSupportChromakey: BOOL): HRESULT; stdcall;
        function DoesSupportLossless(var pfSupportLossless: BOOL): HRESULT; stdcall;
        function DoesSupportMultiframe(var pfSupportMultiframe: BOOL): HRESULT; stdcall;
        function MatchesMimeType(wzMimeType: LPCWSTR; var pfMatches: BOOL): HRESULT; stdcall;
      end;
      IWICBitmapEncoder = interface(IUnknown)
        [SID_IWICBitmapEncoder]
        function Initialize(pIStream: IStream; cacheOption: TWICBitmapEncoderCacheOption): HRESULT; stdcall;
        function GetContainerFormat(var pguidContainerFormat: TGUID): HRESULT; stdcall;
        function GetEncoderInfo(out ppIEncoderInfo: IWICBitmapEncoderInfo): HRESULT; stdcall;
        function SetColorContexts(cCount: UINT; ppIColorContext: PIWICColorContext): HRESULT; stdcall;
        function SetPalette(pIPalette: IWICPalette): HRESULT; stdcall;
        function SetThumbnail(pIThumbnail: IWICBitmapSource): HRESULT; stdcall;
        function SetPreview(pIPreview: IWICBitmapSource): HRESULT; stdcall;
        function CreateNewFrame(out ppIFrameEncode: IWICBitmapFrameEncode; var ppIEncoderOptions: IPropertyBag2): HRESULT; stdcall;
        function Commit: HRESULT; stdcall;
        function GetMetadataQueryWriter(out ppIMetadataQueryWriter: IWICMetadataQueryWriter): HRESULT; stdcall;
      end;
      IWICBitmapDecoder = interface(IUnknown)
        [SID_IWICBitmapDecoder]
        function QueryCapability(pIStream: IStream; var pdwCapability: DWORD): HRESULT; stdcall;
        function Initialize(pIStream: IStream; cacheOptions: TWICDecodeOptions): HRESULT; stdcall;
        function GetContainerFormat(var pguidContainerFormat: TGUID): HRESULT; stdcall;
        function GetDecoderInfo(out ppIDecoderInfo: IWICBitmapDecoderInfo): HRESULT; stdcall;
        function CopyPalette(pIPalette: IWICPalette): HRESULT; stdcall;
        function GetMetadataQueryReader(out ppIMetadataQueryReader: IWICMetadataQueryReader): HRESULT; stdcall;
        function GetPreview(out ppIBitmapSource: IWICBitmapSource): HRESULT; stdcall;
        function GetColorContexts(cCount: UINT; ppIColorContexts: PIWICColorContext; var pcActualCount : UINT): HRESULT; stdcall;
        function GetThumbnail(out ppIThumbnail: IWICBitmapSource): HRESULT; stdcall;
        function GetFrameCount(var pCount: UINT): HRESULT; stdcall;
        function GetFrame(index: UINT; out ppIBitmapFrame: IWICBitmapFrameDecode): HRESULT; stdcall;
      end;
      IWICBitmapEncoderInfo = interface(IWICBitmapCodecInfo)
        [SID_IWICBitmapEncoderInfo]
        function CreateInstance(out ppIBitmapEncoder: IWICBitmapEncoder): HRESULT; stdcall;
      end;
      IWICBitmapDecoderInfo = interface(IWICBitmapCodecInfo)
        [SID_IWICBitmapDecoderInfo]
        function GetPatterns(cbSizePatterns: UINT; pPatterns: PWICBitmapPattern; var pcPatterns: UINT; var pcbPatternsActual: UINT): HRESULT; stdcall;
        function MatchesPattern(pIStream: IStream; var pfMatches: BOOL): HRESULT; stdcall;
        function CreateInstance(out ppIBitmapDecoder: IWICBitmapDecoder): HRESULT; stdcall;
      end;
      IWICBitmapFrameEncode = interface(IUnknown)
        [SID_IWICBitmapFrameEncode]
        function Initialize(pIEncoderOptions: IPropertyBag2): HRESULT; stdcall;
        function SetSize(uiWidth: UINT; uiHeight: UINT): HRESULT; stdcall;
        function SetResolution(dpiX: Double; dpiY: Double): HRESULT; stdcall;
        function SetPixelFormat(var pPixelFormat: TWICPixelFormatGUID): HRESULT; stdcall;
        function SetColorContexts(cCount: UINT; ppIColorContext: PIWICColorContext): HRESULT; stdcall;
        function SetPalette(pIPalette: IWICPalette): HRESULT; stdcall;
        function SetThumbnail(pIThumbnail: IWICBitmapSource): HRESULT; stdcall;
        function WritePixels(lineCount: UINT; cbStride: UINT; cbBufferSize: UINT; pbPixels: PByte): HRESULT; stdcall;
        function WriteSource(pIBitmapSource: IWICBitmapSource; prc: PWICRect): HRESULT; stdcall;
        function Commit: HRESULT; stdcall;
        function GetMetadataQueryWriter(out ppIMetadataQueryWriter: IWICMetadataQueryWriter): HRESULT; stdcall;
      end;
      IWICBitmapFrameDecode = interface(IWICBitmapSource)
        [SID_IWICBitmapFrameDecode]
        function GetMetadataQueryReader(out ppIMetadataQueryReader: IWICMetadataQueryReader): HRESULT; stdcall;
        function GetColorContexts(cCount: UINT; ppIColorContexts: PIWICColorContext; var pcActualCount : UINT): HRESULT; stdcall;
        function GetThumbnail(out ppIThumbnail: IWICBitmapSource): HRESULT; stdcall;
      end;
      IWICBitmapScaler = interface(IWICBitmapSource)
        [SID_IWICBitmapScaler]
        function Initialize(pISource: IWICBitmapSource; uiWidth: UINT; uiHeight: UINT; mode: TWICBitmapInterpolationMode): HRESULT; stdcall;
      end;
      IWICBitmapClipper = interface(IWICBitmapSource)
        [SID_IWICBitmapClipper]
        function Initialize(pISource: IWICBitmapSource; var prc: TWICRect): HRESULT; stdcall;
      end;
      IWICBitmapFlipRotator = interface(IWICBitmapSource)
        [SID_IWICBitmapFlipRotator]
        function Initialize(pISource: IWICBitmapSource; options: TWICBitmapTransformOptions): HRESULT; stdcall;
      end;
      IWICPalette = interface(IUnknown)
        [SID_IWICPalette]
        function InitializePredefined(ePaletteType: TWICBitmapPaletteType; fAddTransparentColor: BOOL): HRESULT; stdcall;
        function InitializeCustom(pColors: PWICColor; cCount: UINT): HRESULT; stdcall;
        function InitializeFromBitmap(pISurface: IWICBitmapSource; cCount: UINT; fAddTransparentColor: BOOL): HRESULT; stdcall;
        function InitializeFromPalette(pIPalette: IWICPalette): HRESULT; stdcall;
        function GetType(var pePaletteType: TWICBitmapPaletteType): HRESULT; stdcall;
        function GetColorCount(var pcCount: UINT): HRESULT; stdcall;
        function GetColors(cCount: UINT; pColors: PWICColor; var pcActualColors: UINT): HRESULT; stdcall;
        function IsBlackWhite(var pfIsBlackWhite: BOOL): HRESULT; stdcall;
        function IsGrayscale(var pfIsGrayscale: BOOL): HRESULT; stdcall;
        function HasAlpha(var pfHasAlpha: BOOL): HRESULT; stdcall;
      end;
      IWICColorContext = interface(IUnknown)
        [SID_IWICColorContext]
        function InitializeFromFilename(wzFilename: LPCWSTR): HRESULT; stdcall;
        function InitializeFromMemory(const pbBuffer: PByte; cbBufferSize: UINT): HRESULT; stdcall;
        function InitializeFromExifColorSpace(value: UINT): HRESULT; stdcall;
        function GetType(var pType: TWICColorContextType): HRESULT; stdcall;
        function GetProfileBytes(cbBuffer: UINT; pbBuffer: PByte; var pcbActual: UINT): HRESULT; stdcall;
        function GetExifColorSpace(var pValue: UINT): HRESULT; stdcall;
      end;
      IWICColorTransform = interface(IWICBitmapSource)
        [SID_IWICColorTransform]
        function Initialize(pIBitmapSource: IWICBitmapSource; pIContextSource: IWICColorContext; pIContextDest: IWICColorContext; pixelFmtDest: TREFWICPixelFormatGUID): HRESULT; stdcall;
      end;
      IWICMetadataQueryReader = interface(IUnknown)
        [SID_IWICMetadataQueryReader]
        function GetContainerFormat(var pguidContainerFormat: TGUID): HRESULT; stdcall;
        function GetLocation(cchMaxLength: UINT; wzNamespace: PWCHAR; var pcchActualLength: UINT): HRESULT; stdcall;
        function GetMetadataByName(wzName: LPCWSTR; var pvarValue: PROPVARIANT): HRESULT; stdcall;
        function GetEnumerator(out ppIEnumString: IEnumString): HRESULT; stdcall;
      end;
      IWICMetadataQueryWriter = interface(IWICMetadataQueryReader)
        [SID_IWICMetadataQueryWriter]
        function SetMetadataByName(wzName: LPCWSTR; const pvarValue: TPropVariant): HRESULT; stdcall;
        function RemoveMetadataByName(wzName: LPCWSTR): HRESULT; stdcall;
      end;
      IWICFastMetadataEncoder = interface(IUnknown)
        [SID_IWICFastMetadataEncoder]
        function Commit: HRESULT; stdcall;
        function GetMetadataQueryWriter(out ppIMetadataQueryWriter: IWICMetadataQueryWriter): HRESULT; stdcall;
      end;
      IWICStream = interface(IStream)
        [SID_IWICStream]
        function InitializeFromIStream(pIStream: IStream): HRESULT; stdcall;
        function InitializeFromFilename(wzFileName: LPCWSTR; dwDesiredAccess: DWORD): HRESULT; stdcall;
        function InitializeFromMemory(pbBuffer: TWICInProcPointer; cbBufferSize: DWORD): HRESULT; stdcall;
        function InitializeFromIStreamRegion(pIStream: IStream; ulOffset: ULARGE_INTEGER; ulMaxSize: ULARGE_INTEGER): HRESULT; stdcall;
      end;
      IWICFormatConverter = interface(IWICBitmapSource)
        [SID_IWICFormatConverter]
        function Initialize(pISource: IWICBitmapSource; const dstFormat: TWICPixelFormatGUID; dither: TWICBitmapDitherType; const pIPalette: IWICPalette; alphaThresholdPercent: Double; paletteTranslate: TWICBitmapPaletteType): HRESULT; stdcall;
        function CanConvert(srcPixelFormat: TREFWICPixelFormatGUID; dstPixelFormat: TREFWICPixelFormatGUID; var pfCanConvert: BOOL): HRESULT; stdcall;
      end;
      IWICImagingFactory = interface(IUnknown)
        [SID_IWICImagingFactory]
        function CreateDecoderFromFilename(wzFilename: LPCWSTR; const pguidVendor: TGUID; dwDesiredAccess: DWORD; metadataOptions: TWICDecodeOptions; out ppIDecoder: IWICBitmapDecoder): HRESULT; stdcall;
        function CreateDecoderFromStream(pIStream: IStream; const pguidVendor: TGUID; metadataOptions: TWICDecodeOptions; out ppIDecoder: IWICBitmapDecoder): HRESULT; stdcall;
        function CreateDecoderFromFileHandle(hFile: ULONG_PTR; const pguidVendor: TGUID; metadataOptions: TWICDecodeOptions; out ppIDecoder: IWICBitmapDecoder): HRESULT; stdcall;
        function CreateComponentInfo(const clsidComponent: TGUID; out ppIInfo: IWICComponentInfo): HRESULT; stdcall;
        function CreateDecoder(const guidContainerFormat: TGUID; const pguidVendor: TGUID; out ppIDecoder: IWICBitmapDecoder): HRESULT; stdcall;
        function CreateEncoder(const guidContainerFormat: TGUID; const pguidVendor: TGUID; out ppIEncoder: IWICBitmapEncoder): HRESULT; stdcall;
        function CreatePalette(out ppIPalette: IWICPalette): HRESULT; stdcall;
        function CreateFormatConverter(out ppIFormatConverter: IWICFormatConverter): HRESULT; stdcall;
        function CreateBitmapScaler(out ppIBitmapScaler: IWICBitmapScaler): HRESULT; stdcall;
        function CreateBitmapClipper(out ppIBitmapClipper: IWICBitmapClipper): HRESULT; stdcall;
        function CreateBitmapFlipRotator(out ppIBitmapFlipRotator: IWICBitmapFlipRotator): HRESULT; stdcall;
        function CreateStream(out ppIWICStream: IWICStream): HRESULT; stdcall;
        function CreateColorContext(out ppIWICColorContext: IWICColorContext): HRESULT; stdcall;
        function CreateColorTransformer(out ppIWICColorTransform: IWICColorTransform): HRESULT; stdcall;
        function CreateBitmap(uiWidth: UINT; uiHeight: UINT; pixelFormat: TREFWICPixelFormatGUID; option: TWICBitmapCreateCacheOption; out ppIBitmap: IWICBitmap): HRESULT; stdcall;
        function CreateBitmapFromSource(pIBitmapSource: IWICBitmapSource; option: TWICBitmapCreateCacheOption; out ppIBitmap: IWICBitmap): HRESULT; stdcall;
        function CreateBitmapFromSourceRect(pIBitmapSource: IWICBitmapSource; x: UINT; y: UINT; width: UINT; height: UINT; out ppIBitmap: IWICBitmap): HRESULT; stdcall;
        function CreateBitmapFromMemory(uiWidth: UINT; uiHeight: UINT; const pixelFormat: TWICPixelFormatGUID; cbStride: UINT; cbBufferSize: UINT; pbBuffer: PByte; out ppIBitmap: IWICBitmap): HRESULT; stdcall;
        function CreateBitmapFromHBITMAP(hBitmap: HBITMAP; hPalette: HPALETTE; options: TWICBitmapAlphaChannelOption; out ppIBitmap: IWICBitmap): HRESULT; stdcall;
        function CreateBitmapFromHICON(hIcon: HICON; out ppIBitmap: IWICBitmap): HRESULT; stdcall;
        function CreateComponentEnumerator(componentTypes: DWORD; options: DWORD; out ppIEnumUnknown: IEnumUnknown): HRESULT; stdcall;
        function CreateFastMetadataEncoderFromDecoder(pIDecoder: IWICBitmapDecoder; out ppIFastEncoder: IWICFastMetadataEncoder): HRESULT; stdcall;
        function CreateFastMetadataEncoderFromFrameDecode(pIFrameDecoder: IWICBitmapFrameDecode; out ppIFastEncoder: IWICFastMetadataEncoder): HRESULT; stdcall;
        function CreateQueryWriter(const guidMetadataFormat: TGUID; const pguidVendor: TGUID; out ppIQueryWriter: IWICMetadataQueryWriter): HRESULT; stdcall;
        function CreateQueryWriterFromReader(pIQueryReader: IWICMetadataQueryReader; const pguidVendor: TGUID; out ppIQueryWriter: IWICMetadataQueryWriter): HRESULT; stdcall;
      end;
    
      function WICConvertBitmapSource(const dstFormat: TWICPixelFormatGUID; pISrc: IWICBitmapSource; out ppIDst: IWICBitmapSource): HRESULT; stdcall;
        external 'windowscodecs.dll' name 'WICConvertBitmapSource';
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        FImagingFactory: IWICImagingFactory;
        procedure JpegToBitmap(const ASource, ATarget: string);
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.JpegToBitmap(const ASource, ATarget: string);
    var
      FileStream: TFileStream;
      StreamAdapter: TStreamAdapter;
      BitmapInfo: TBitmapInfo;
      BitmapBits: array of Byte;
      BitmapWidth: Cardinal;
      BitmapHeight: Cardinal;
      BitmapOutput: TBitmap;
      BitmapObject: IWICBitmap;
      BitmapSource: IWICBitmapSource;
      BitmapDecoder: IWICBitmapDecoder;
      BitmapFrame: IWICBitmapFrameDecode;
    begin
      if not Assigned(FImagingFactory) then
        CoCreateInstance(CLSID_WICImagingFactory, nil, CLSCTX_INPROC_SERVER or
          CLSCTX_LOCAL_SERVER, IUnknown, FImagingFactory);
    
      FileStream := TFileStream.Create(ASource, fmOpenRead or fmShareDenyWrite);
      try
        FileStream.Position := 0;
        StreamAdapter := TStreamAdapter.Create(FileStream);
    
        OleCheck(FImagingFactory.CreateDecoderFromStream(StreamAdapter, GUID_NULL,
          WICDecodeMetadataCacheOnDemand, BitmapDecoder));
        OleCheck(BitmapDecoder.GetFrame(0, BitmapFrame));
        OleCheck(FImagingFactory.CreateBitmapFromSource(BitmapFrame,
          WICBitmapCacheOnLoad, BitmapObject));
        OleCheck(BitmapObject.GetSize(BitmapWidth, BitmapHeight));
        SetLength(BitmapBits, BitmapWidth * BitmapHeight * 4);
        OleCheck(WICConvertBitmapSource(GUID_WICPixelFormat32bppBGRA, BitmapObject,
          BitmapSource));
        OleCheck(BitmapSource.CopyPixels(nil, BitmapWidth * 4, Length(BitmapBits),
          @BitmapBits[0]));
    
        FillChar(BitmapInfo, SizeOf(BitmapInfo), 0);
        BitmapInfo.bmiHeader.biSize := SizeOf(BitmapInfo);
        BitmapInfo.bmiHeader.biWidth := BitmapWidth;
        BitmapInfo.bmiHeader.biHeight := -BitmapHeight;
        BitmapInfo.bmiHeader.biPlanes := 1;
        BitmapInfo.bmiHeader.biBitCount := 32;
    
        BitmapOutput := TBitmap.Create;
        try
          BitmapOutput.PixelFormat := pf32bit;
          BitmapOutput.SetSize(BitmapWidth, BitmapHeight);
          SetDIBits(0, BitmapOutput.Handle, 0, BitmapHeight, @BitmapBits[0],
            BitmapInfo, DIB_RGB_COLORS);
          BitmapOutput.AlphaFormat := afDefined;
          BitmapOutput.SaveToFile(ATarget);
        finally
          BitmapOutput.Free;
        end;
      finally
        FileStream.Free;
      end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      JpegToBitmap('d:\SourceImage.jpg', 'd:\TargetImage.bmp');
    end;
    
    end.