type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
FImagingFactory: IWICImagingFactory;
function JpegToBitmap(const ASource, ATarget: string): Boolean;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
JpegToBitmap('C:\a\F14_0254.NEF', 'c:\a\F14_0254.bmp');
showmessage('fertig');
end;
function TForm1.JpegToBitmap(const ASource, ATarget: string): Boolean;
var
FileStream: TFileStream;
StreamAdapter: TStreamAdapter;
BitmapInfo: TBitmapInfo;
BitmapBits: array of Byte;
BitmapWidth: Cardinal;
BitmapHeight: Cardinal;
BitmapOutput: graphics.TBitmap;
BitmapObject: IWICBitmap;
BitmapSource: IWICBitmapSource;
BitmapDecoder: IWICBitmapDecoder;
BitmapFrame: IWICBitmapFrameDecode;
i: Integer;
b: hBitmap;
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);
for i:=0 to 20 do
begin
Memo1.Lines.Add(IntToStr(i)+':'+IntToStr(BitmapBits[i]));
end;
Memo1.Lines.Add('-------------------------------');
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;
B := CreateBitmap(BitmapWidth, BitmapHeight, 1, 32, @BitmapBits[0]);
try
BitmapOutput.PixelFormat := pf32bit;
BitmapOutput.SetSize(BitmapWidth, BitmapHeight);
//SetDIBits(0, BitmapOutput.Handle, 0, BitmapHeight, @BitmapBits[0], BitmapInfo, DIB_RGB_COLORS);
SetDIBits(0, b, 0, BitmapHeight, @BitmapBits[0], BitmapInfo, DIB_RGB_COLORS);
//BitmapOutput.AlphaFormat := afDefined;
BitmapOutput.LoadFromBitmapHandles(b,0);
//BitmapOutput.CreateFromBitmapHandles(B, 0, Rect(0, 0, BitmapWidth, BitmapHeight))
BitmapOutput.SaveToFile(ATarget);
finally
DeleteObject(b);
BitmapOutput.Free;
end;
finally
FileStream.Free;
end;
end;
end.