我需要在 Delphi 2007 中阅读并将一些 1.7mb 左右的图片从 jpg 转换为 bmp。
一些图片在转换后被剪切、灰度或最差。
我进行了搜索,但无论如何我都没有找到在 delphi 2007 中添加 WIC 例程(如 TWicImage)的技巧。
我在某处读到它可以通过 COM 轻松添加,但我不知道如何或必须导入什么文件。
谢谢你。
我需要在 Delphi 2007 中阅读并将一些 1.7mb 左右的图片从 jpg 转换为 bmp。
一些图片在转换后被剪切、灰度或最差。
我进行了搜索,但无论如何我都没有找到在 delphi 2007 中添加 WIC 例程(如 TWicImage)的技巧。
我在某处读到它可以通过 COM 轻松添加,但我不知道如何或必须导入什么文件。
谢谢你。
以下是如何使用 WIC 将 JPEG 转换为位图的示例:
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.