SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: diego.martinez en Jueves 12 de Febrero de 2009, 15:39

Título: Problema de visualizacion de Stretchdibits
Publicado por: diego.martinez en Jueves 12 de Febrero de 2009, 15:39
Buenas:

Trabajando con Win32, tengo una imagen en un buffer rgb (o mejor dicho BGR).

Ese buffer esta correcto, lo pinto pixel a pixel y se ve perfecto. Lo paso a un raw y lo habro con photoshop y perfecto tambien.

Ahora, cuando lo visualizo con stretchdibits aparece con unas muestras erroneas de colores pintado en diagonal como si estuviera la anchura un pixel mas grande.

el codigo que uso es simple.


Código: C++
  1.  
  2. BITMAPINFO  dib;
  3. HDC dc;
  4. BYTE * data;
  5.                                 int w=img->GetWidth();
  6.                 int h=img->GetHeight();
  7.                 //img->Draw(GetDC(hWnd),0,0,w*mul,h*mul);          
  8.                 dc=GetDC(hWnd);            
  9.                 data=img->GetData();               
  10.  
  11.                 memset(&dib,0,sizeof(dib));
  12.                 dib.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  13.                 dib.bmiHeader.biHeight          = -h; //Alto
  14.                 dib.bmiHeader.biWidth           = w; //Largo
  15.                 dib.bmiHeader.biPlanes          = 1;
  16.                 dib.bmiHeader.biBitCount        = 3*8;
  17.                 dib.bmiHeader.biClrUsed         = 0;
  18.                 dib.bmiHeader.biClrImportant    = 0;
  19.                 dib.bmiHeader.biXPelsPerMeter   =0;
  20.                 dib.bmiHeader.biYPelsPerMeter   =0;
  21.                 dib.bmiHeader.biCompression     = BI_RGB;
  22.                 dib.bmiHeader.biSizeImage       =0;            
  23.  
  24.                
  25.                 if (StretchDIBits(dc,0,0,w,h, 0, 0, w,h, data,&dib, DIB_RGB_COLORS, SRCCOPY)!=h)
  26.                 {
  27.                     //...error
  28.                 }
  29.  
  30.  


este codigo solo falla con ciertos tamaños de imagen. Sin embargo la imagen esta perfecta y los valores de w y h estan correctos, a que puede deberse el error? es un bug de la api?

gracias

la imagen sale asi:
(http://i39.tinypic.com/2r39iyb_th.jpg)

no me pasa con todas solo con algunas, pero la descompresion es correcta.
supongo que tendra que ver con las proporciones o algun dato que no estoy usando bien
Título: Re: Problema de visualizacion de Stretchdibits
Publicado por: diego.martinez en Jueves 12 de Febrero de 2009, 17:06
con SetDIBitsToDevice tambien falla :S
Título: Re: Problema de visualizacion de Stretchdibits
Publicado por: diego.martinez en Martes 17 de Febrero de 2009, 21:11
Buenas:

he descubierto la razon por la que se produce el Skew, (la forma de verse mal) por lo que comentan en los foros, el stretchdibits debe de tener el ancho alineado al DWORD.

Como puedo hacer esto?

EDIT: esto solo ocurre en las imagenes de 32 bits y la mia es de 24, luego no hay que alinear nada, pero se sigue viendo mal.
Título: Re: Problema de visualizacion de Stretchdibits
Publicado por: Eternal Idol en Martes 17 de Febrero de 2009, 22:02
Por lo que creo es un tema de padding, supongo que tendras que agregar X bytes al final de cada linea para que esta sea divisible por 4 (sizeof DWORD). Si es asi el tema seria que tendrias que reservar un nuevo buffer con el tamaño suficiente y hacer algo como:

memcpy(nBuffer, vBuffer, sizeOfLine);
memset(nBuffer + sizeOfLine, 0, 4 - 4 % sizeOfLine);

En cada una de las lineas ... trata con eso  y sino dejas el codigo y una de las imagenes que no funcionen.

PD. Una imagen de 32 bits no puede tener este problema al ser justamente cada pixel un DWORD, en tu caso un imagen de por ejemplo 54 de pixeles de ancho deberia dar el problema al ser: 54 * 3 = 162 % 4 = 2.
Título: Re: Problema de visualizacion de Stretchdibits
Publicado por: diego.martinez en Jueves 19 de Febrero de 2009, 19:20
Muchisimas gracias!

eras asi como se resolvia!

gracias de nuevo eternalidol!
 :lol:
Título: Re: Problema de visualizacion de Stretchdibits
Publicado por: Eternal Idol en Jueves 19 de Febrero de 2009, 21:48
De nadas  B) Algo me acordaba de hace siglos de trabajar con BMPs  :devil: