У меня есть TWicImage, IWicBitmap и IWicBitmapSource, который работает приятно для отображения всех поддерживаемых графических форматов файлов, позволяет Вращение, Зеркально отраженную Горизонтальную, Зеркально отраженную Вертикаль, Scaleing и Clipping. Все они, кажется, работают хорошо, и я могу получить WicImages pixelformat, но я не могу выяснить, как изменить или установить pixelformat TWicImage.
Я создал диалоговое окно для возврата WICPixelFormatGUID, который будет использоваться в качестве pixelformat для преобразования.
Кто-либо может совместно использовать некоторый код, который демонстрирует, как изменить pixelformat WicImage с IWICColorTransform или другим методом Wincodec?
Счет
На полпути до 2011 теперь... так для тех, которые могут хотеть знать, что я попробовал это и это, кажется, работает (это использует TcxImage Developer Express, но я подозреваемый TImage буду работать также):
procedure TForm1.N16bitBGR1Click( Sender: TObject );
var
wicImg: TWICImage;
wicBitmap: IWICBitmap;
iBmpSource: IWICBitmapSource;
puiWidth, puiHeight: UINT;
iConverter: IWICFormatConverter;
begin
if cxImage1.Picture.Graphic is TWICImage then
begin
Screen.Cursor := crHourGlass;
try
wicImg := TWICImage( cxImage1.Picture.Graphic );
wicImg.ImagingFactory.CreateFormatConverter( iConverter );
iBmpSource := wicImg.Handle as IWICBitmapSource;
iBmpSource.GetSize( puiWidth, puiHeight );
iConverter.Initialize( iBmpSource, GUID_WICPixelFormat16bppBGR555, WICBitmapDitherTypeNone, nil, 0,
WICBitmapPaletteTypeMedianCut );
wicImg.ImagingFactory.CreateBitmapFromSourceRect( iConverter, 0, 0, puiWidth, puiHeight, wicBitmap );
if Assigned( wicBitmap ) then
wicImg.Handle := wicBitmap;
cxImage1.Repaint;
cxImage1.Update;
cxImage1.Invalidate;
dxStatusBar1.Panels[ 0 ].Text := ExtractFileDir( AFilename );
dxStatusBar1.Panels[ 1 ].Text := ExtractFileName( AFilename );
dxStatusBar1.Panels[ 2 ].Text := 'Width: ' + IntToStr( WICImageWidth( cxImage1 ) );
dxStatusBar1.Panels[ 3 ].Text := 'Height: ' + IntToStr( WICImageHeight( cxImage1 ) );
dxStatusBar1.Panels[ 4 ].Text := 'Pixel Format: ' + WICGetPixelFormat( cxImage1 );
finally
Screen.Cursor := crDefault;
end;
end;
end;
procedure TForm1.N16bitGray1Click( Sender: TObject );
var
wicImg: TWICImage;
wicBitmap: IWICBitmap;
iBmpSource: IWICBitmapSource;
puiWidth, puiHeight: UINT;
iConverter: IWICFormatConverter;
begin
if cxImage1.Picture.Graphic is TWICImage then
begin
Screen.Cursor := crHourGlass;
try
wicImg := TWICImage( cxImage1.Picture.Graphic );
wicImg.ImagingFactory.CreateFormatConverter( iConverter );
iBmpSource := wicImg.Handle as IWICBitmapSource;
iBmpSource.GetSize( puiWidth, puiHeight );
iConverter.Initialize( iBmpSource, GUID_WICPixelFormat16bppGray, WICBitmapDitherTypeSolid, nil, 0,
WICBitmapPaletteTypeFixedGray16 );
wicImg.ImagingFactory.CreateBitmapFromSourceRect( iConverter, 0, 0, puiWidth, puiHeight, wicBitmap );
if Assigned( wicBitmap ) then
wicImg.Handle := wicBitmap;
cxImage1.Repaint;
cxImage1.Update;
cxImage1.Invalidate;
dxStatusBar1.Panels[ 0 ].Text := ExtractFileDir( AFilename );
dxStatusBar1.Panels[ 1 ].Text := ExtractFileName( AFilename );
dxStatusBar1.Panels[ 2 ].Text := 'Width: ' + IntToStr( WICImageWidth( cxImage1 ) );
dxStatusBar1.Panels[ 3 ].Text := 'Height: ' + IntToStr( WICImageHeight( cxImage1 ) );
dxStatusBar1.Panels[ 4 ].Text := 'Pixel Format: ' + WICGetPixelFormat( cxImage1 );
finally
Screen.Cursor := crDefault;
end;
end;
end;
procedure TForm1.N24bitGBB1Click( Sender: TObject );
var
wicImg: TWICImage;
wicBitmap: IWICBitmap;
iBmpSource: IWICBitmapSource;
puiWidth, puiHeight: UINT;
iConverter: IWICFormatConverter;
begin
if cxImage1.Picture.Graphic is TWICImage then
begin
Screen.Cursor := crHourGlass;
try
wicImg := TWICImage( cxImage1.Picture.Graphic );
wicImg.ImagingFactory.CreateFormatConverter( iConverter );
iBmpSource := wicImg.Handle as IWICBitmapSource;
iBmpSource.GetSize( puiWidth, puiHeight );
iConverter.Initialize( iBmpSource, GUID_WICPixelFormat24bppBGR, WICBitmapDitherTypeNone, nil, 0,
WICBitmapPaletteTypeMedianCut );
wicImg.ImagingFactory.CreateBitmapFromSourceRect( iConverter, 0, 0, puiWidth, puiHeight, wicBitmap );
if Assigned( wicBitmap ) then
wicImg.Handle := wicBitmap;
cxImage1.Repaint;
cxImage1.Update;
cxImage1.Invalidate;
dxStatusBar1.Panels[ 0 ].Text := ExtractFileDir( AFilename );
dxStatusBar1.Panels[ 1 ].Text := ExtractFileName( AFilename );
dxStatusBar1.Panels[ 2 ].Text := 'Width: ' + IntToStr( WICImageWidth( cxImage1 ) );
dxStatusBar1.Panels[ 3 ].Text := 'Height: ' + IntToStr( WICImageHeight( cxImage1 ) );
dxStatusBar1.Panels[ 4 ].Text := 'Pixel Format: ' + WICGetPixelFormat( cxImage1 );
finally
Screen.Cursor := crDefault;
end;
end;
end;
procedure TForm1.N2bitIndexed1Click( Sender: TObject );
var
wicImg: TWICImage;
wicBitmap: IWICBitmap;
iBmpSource: IWICBitmapSource;
puiWidth, puiHeight: UINT;
iConverter: IWICFormatConverter;
begin
if cxImage1.Picture.Graphic is TWICImage then
begin
Screen.Cursor := crHourGlass;
try
wicImg := TWICImage( cxImage1.Picture.Graphic );
wicImg.ImagingFactory.CreateFormatConverter( iConverter );
iBmpSource := wicImg.Handle as IWICBitmapSource;
iBmpSource.GetSize( puiWidth, puiHeight );
iConverter.Initialize( iBmpSource, GUID_WICPixelFormat2bppIndexed, WICBitmapDitherTypeNone, nil, 0,
WICBitmapPaletteTypeMedianCut );
wicImg.ImagingFactory.CreateBitmapFromSourceRect( iConverter, 0, 0, puiWidth, puiHeight, wicBitmap );
if Assigned( wicBitmap ) then
wicImg.Handle := wicBitmap;
cxImage1.Repaint;
cxImage1.Update;
cxImage1.Invalidate;
dxStatusBar1.Panels[ 0 ].Text := ExtractFileDir( AFilename );
dxStatusBar1.Panels[ 1 ].Text := ExtractFileName( AFilename );
dxStatusBar1.Panels[ 2 ].Text := 'Width: ' + IntToStr( WICImageWidth( cxImage1 ) );
dxStatusBar1.Panels[ 3 ].Text := 'Height: ' + IntToStr( WICImageHeight( cxImage1 ) );
dxStatusBar1.Panels[ 4 ].Text := 'Pixel Format: ' + WICGetPixelFormat( cxImage1 );
finally
Screen.Cursor := crDefault;
end;
end;
end;
procedure TForm1.N32bitGray1Click( Sender: TObject );
var
wicImg: TWICImage;
wicBitmap: IWICBitmap;
iBmpSource: IWICBitmapSource;
puiWidth, puiHeight: UINT;
iConverter: IWICFormatConverter;
begin
if cxImage1.Picture.Graphic is TWICImage then
begin
Screen.Cursor := crHourGlass;
try
wicImg := TWICImage( cxImage1.Picture.Graphic );
wicImg.ImagingFactory.CreateFormatConverter( iConverter );
iBmpSource := wicImg.Handle as IWICBitmapSource;
iBmpSource.GetSize( puiWidth, puiHeight );
iConverter.Initialize( iBmpSource, GUID_WICPixelFormat32bppGrayFloat, WICBitmapDitherTypeSolid, nil, 0,
WICBitmapPaletteTypeFixedGray256 );
wicImg.ImagingFactory.CreateBitmapFromSourceRect( iConverter, 0, 0, puiWidth, puiHeight, wicBitmap );
if Assigned( wicBitmap ) then
wicImg.Handle := wicBitmap;
cxImage1.Repaint;
cxImage1.Update;
cxImage1.Invalidate;
dxStatusBar1.Panels[ 0 ].Text := ExtractFileDir( AFilename );
dxStatusBar1.Panels[ 1 ].Text := ExtractFileName( AFilename );
dxStatusBar1.Panels[ 2 ].Text := 'Width: ' + IntToStr( WICImageWidth( cxImage1 ) );
dxStatusBar1.Panels[ 3 ].Text := 'Height: ' + IntToStr( WICImageHeight( cxImage1 ) );
dxStatusBar1.Panels[ 4 ].Text := 'Pixel Format: ' + WICGetPixelFormat( cxImage1 );
finally
Screen.Cursor := crDefault;
end;
end;
end;
procedure TForm1.N32bitGRBA1Click( Sender: TObject );
var
wicImg: TWICImage;
wicBitmap: IWICBitmap;
iBmpSource: IWICBitmapSource;
puiWidth, puiHeight: UINT;
iConverter: IWICFormatConverter;
begin
if cxImage1.Picture.Graphic is TWICImage then
begin
Screen.Cursor := crHourGlass;
try
wicImg := TWICImage( cxImage1.Picture.Graphic );
wicImg.ImagingFactory.CreateFormatConverter( iConverter );
iBmpSource := wicImg.Handle as IWICBitmapSource;
iBmpSource.GetSize( puiWidth, puiHeight );
iConverter.Initialize( iBmpSource, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, nil, 0,
WICBitmapPaletteTypeMedianCut );
wicImg.ImagingFactory.CreateBitmapFromSourceRect( iConverter, 0, 0, puiWidth, puiHeight, wicBitmap );
if Assigned( wicBitmap ) then
wicImg.Handle := wicBitmap;
cxImage1.Repaint;
cxImage1.Update;
cxImage1.Invalidate;
dxStatusBar1.Panels[ 0 ].Text := ExtractFileDir( AFilename );
dxStatusBar1.Panels[ 1 ].Text := ExtractFileName( AFilename );
dxStatusBar1.Panels[ 2 ].Text := 'Width: ' + IntToStr( WICImageWidth( cxImage1 ) );
dxStatusBar1.Panels[ 3 ].Text := 'Height: ' + IntToStr( WICImageHeight( cxImage1 ) );
dxStatusBar1.Panels[ 4 ].Text := 'Pixel Format: ' + WICGetPixelFormat( cxImage1 );
finally
Screen.Cursor := crDefault;
end;
end;
end;
procedure TForm1.N4bitIndexed1Click( Sender: TObject );
var
wicImg: TWICImage;
wicBitmap: IWICBitmap;
iBmpSource: IWICBitmapSource;
puiWidth, puiHeight: UINT;
iConverter: IWICFormatConverter;
begin
if cxImage1.Picture.Graphic is TWICImage then
begin
Screen.Cursor := crHourGlass;
try
wicImg := TWICImage( cxImage1.Picture.Graphic );
wicImg.ImagingFactory.CreateFormatConverter( iConverter );
iBmpSource := wicImg.Handle as IWICBitmapSource;
iBmpSource.GetSize( puiWidth, puiHeight );
iConverter.Initialize( iBmpSource, GUID_WICPixelFormat4bppIndexed, WICBitmapDitherTypeNone, nil, 0,
WICBitmapPaletteTypeMedianCut );
wicImg.ImagingFactory.CreateBitmapFromSourceRect( iConverter, 0, 0, puiWidth, puiHeight, wicBitmap );
if Assigned( wicBitmap ) then
wicImg.Handle := wicBitmap;
cxImage1.Repaint;
cxImage1.Update;
cxImage1.Invalidate;
dxStatusBar1.Panels[ 0 ].Text := ExtractFileDir( AFilename );
dxStatusBar1.Panels[ 1 ].Text := ExtractFileName( AFilename );
dxStatusBar1.Panels[ 2 ].Text := 'Width: ' + IntToStr( WICImageWidth( cxImage1 ) );
dxStatusBar1.Panels[ 3 ].Text := 'Height: ' + IntToStr( WICImageHeight( cxImage1 ) );
dxStatusBar1.Panels[ 4 ].Text := 'Pixel Format: ' + WICGetPixelFormat( cxImage1 );
finally
Screen.Cursor := crDefault;
end;
end;
end;
procedure TForm1.N8bitGray1Click( Sender: TObject );
var
wicImg: TWICImage;
wicBitmap: IWICBitmap;
iBmpSource: IWICBitmapSource;
puiWidth, puiHeight: UINT;
iConverter: IWICFormatConverter;
begin
if cxImage1.Picture.Graphic is TWICImage then
begin
Screen.Cursor := crHourGlass;
try
wicImg := TWICImage( cxImage1.Picture.Graphic );
wicImg.ImagingFactory.CreateFormatConverter( iConverter );
iBmpSource := wicImg.Handle as IWICBitmapSource;
iBmpSource.GetSize( puiWidth, puiHeight );
iConverter.Initialize( iBmpSource, GUID_WICPixelFormat8bppGray, WICBitmapDitherTypeSolid, nil, 0,
WICBitmapPaletteTypeMedianCut );
wicImg.ImagingFactory.CreateBitmapFromSourceRect( iConverter, 0, 0, puiWidth, puiHeight, wicBitmap );
if Assigned( wicBitmap ) then
wicImg.Handle := wicBitmap;
cxImage1.Repaint;
cxImage1.Update;
cxImage1.Invalidate;
dxStatusBar1.Panels[ 0 ].Text := ExtractFileDir( AFilename );
dxStatusBar1.Panels[ 1 ].Text := ExtractFileName( AFilename );
dxStatusBar1.Panels[ 2 ].Text := 'Width: ' + IntToStr( WICImageWidth( cxImage1 ) );
dxStatusBar1.Panels[ 3 ].Text := 'Height: ' + IntToStr( WICImageHeight( cxImage1 ) );
dxStatusBar1.Panels[ 4 ].Text := 'Pixel Format: ' + WICGetPixelFormat( cxImage1 );
finally
Screen.Cursor := crDefault;
end;
end;
end;
procedure TForm1.N8bitIndexed1Click( Sender: TObject );
var
wicImg: TWICImage;
wicBitmap: IWICBitmap;
iBmpSource: IWICBitmapSource;
puiWidth, puiHeight: UINT;
iConverter: IWICFormatConverter;
begin
if cxImage1.Picture.Graphic is TWICImage then
begin
Screen.Cursor := crHourGlass;
try
wicImg := TWICImage( cxImage1.Picture.Graphic );
wicImg.ImagingFactory.CreateFormatConverter( iConverter );
iBmpSource := wicImg.Handle as IWICBitmapSource;
iBmpSource.GetSize( puiWidth, puiHeight );
iConverter.Initialize( iBmpSource, GUID_WICPixelFormat8bppIndexed, WICBitmapDitherTypeNone, nil, 0,
WICBitmapPaletteTypeFixedGray256 );
wicImg.ImagingFactory.CreateBitmapFromSourceRect( iConverter, 0, 0, puiWidth, puiHeight, wicBitmap );
if Assigned( wicBitmap ) then
wicImg.Handle := wicBitmap;
cxImage1.Repaint;
cxImage1.Update;
cxImage1.Invalidate;
dxStatusBar1.Panels[ 0 ].Text := ExtractFileDir( AFilename );
dxStatusBar1.Panels[ 1 ].Text := ExtractFileName( AFilename );
dxStatusBar1.Panels[ 2 ].Text := 'Width: ' + IntToStr( WICImageWidth( cxImage1 ) );
dxStatusBar1.Panels[ 3 ].Text := 'Height: ' + IntToStr( WICImageHeight( cxImage1 ) );
dxStatusBar1.Panels[ 4 ].Text := 'Pixel Format: ' + WICGetPixelFormat( cxImage1 );
finally
Screen.Cursor := crDefault;
end;
end;
end;