• Domingo 15 de Diciembre de 2024, 21:49

Autor Tema:  Problema de visualizacion de Stretchdibits  (Leído 1158 veces)

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Problema de visualizacion de Stretchdibits
« en: Jueves 12 de Febrero de 2009, 15:39 »
0
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:


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

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Problema de visualizacion de Stretchdibits
« Respuesta #1 en: Jueves 12 de Febrero de 2009, 17:06 »
0
con SetDIBitsToDevice tambien falla :S

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Problema de visualizacion de Stretchdibits
« Respuesta #2 en: Martes 17 de Febrero de 2009, 21:11 »
0
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.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema de visualizacion de Stretchdibits
« Respuesta #3 en: Martes 17 de Febrero de 2009, 22:02 »
0
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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Problema de visualizacion de Stretchdibits
« Respuesta #4 en: Jueves 19 de Febrero de 2009, 19:20 »
0
Muchisimas gracias!

eras asi como se resolvia!

gracias de nuevo eternalidol!
 :lol:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema de visualizacion de Stretchdibits
« Respuesta #5 en: Jueves 19 de Febrero de 2009, 21:48 »
0
De nadas  B) Algo me acordaba de hace siglos de trabajar con BMPs  :devil:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.