问题
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.
回答1:
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.
来源:https://stackoverflow.com/questions/12271583/delphi-2007-using-windows-imaging-component-wic