Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to change the pixelformat of a TWICImage in Delphi 2010
    text
    copied!<p>I have a TWicImage, IWicBitmap and a IWicBitmapSource that works nicely to display all the supported graphic fileformats, allows Rotation, Flip Horizontal, Flip Vertical, Scaleing and Clipping. All of these seem to work well and I can get the WicImages pixelformat, but i can not figure out how to change or set a TWicImage's pixelformat.</p> <p>I created a dialog to return WICPixelFormatGUID to be used as the pixelformat for the transformation.</p> <p>Can anyone share some code that demonstrates how to change the pixelformat of a WicImage with IWICColorTransform or other Wincodec method? </p> <p>Bill</p> <p>Its midway through 2011 now... so for those that may want to know I tried this and it seems to work( it uses TcxImage by Developer Express, but I suspect TImage will work as well):</p> <pre><code>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; </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload