Tengo un TWicImage, IWicBitmap y un IWicBitmapSource que funciona bien para mostrar todos los formatos de archivo gráficos compatibles, permite la rotación, voltear horizontalmente, voltear verticalmente, escalar y recortar. Todos estos parecen funcionar bien y puedo obtener el formato de pixel de WicImages, pero no puedo encontrar la manera de cambiar o establecer un formato de pixel de TWicImage.Cómo cambiar el formato de píxel de un TWICImage en Delphi 2010
Creé un diálogo para devolver WICPixelFormatGUID para usar como el formato de píxel para la transformación.
¿Alguien puede compartir algún código que demuestre cómo cambiar el formato de píxeles de un WicImage con IWICColorTransform u otro método de Wincodec?
Bill
Su mitad de 2011 ahora ... así que para aquellos que pueden querer saber Probé esto y parece que funciona (que utiliza TcxImage de Developer Express, pero sospecho TImage funcionará tan bien) :
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;
+1 , de todos modos, simplemente puede usar la función ['WICConvertBitmapSource'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ee719819 (v = vs.85) .aspx) sin necesidad de formato convertidor para esto. – TLama
Hola Bill, tu respuesta en la parte superior de las preguntas sin respuesta de Delphi. Si lo leí correctamente lo resolvió y puso su respuesta en su pregunta. ¿Podría colocar la respuesta en la sección de respuestas y aceptarla? – bummi
Ahora es noviembre y eso no está hecho, sugiero que alguien lo haga por él, con la atribución. –