Red de conocimiento informático - Material del sitio web - Cómo crear un efecto de rotación en VC

Cómo crear un efecto de rotación en VC

// RotateDIB - Crea un nuevo mapa de bits con la imagen rotada

// Devuelve - Devuelve un nuevo mapa de bits con la imagen rotada

// hDIB - Independiente del dispositivo a rotar Mapa de bits

// fDegrees: el ángulo de rotación en grados

// clrBack: el color de los píxeles en el mapa de bits resultante

//cobertura de píxeles sin origen

HDIB RotateDIB(HDIB hDIB, double fDegrees, COLORREF clrBack)

{

WaitCursorBegin();

//Obtener información de mapa de bits de origen

LPBITMAPINFO lpBmInfo =(LPBITMAPINFO)bloqueo global(hDIB);

int bpp = lpBmInfo-& gt;bmiHeader.biBitCount//bits por píxel

int n colores = información lpb->bmiHeader.biClrUsed? lpBmInfo->bmiHeader.biClrUsed:

1 & lt;& ltbpp

int nWidth = lpb info->BMI header .

int. n altura = lpb info-& gt.

Encabezado IMC altura BIH;

int nRowBytes =((((nWidth * bpp)+31)&~31) / 8);

//Asegúrese de que la altura sea positiva. valor y biCompression es BI_RGB o BI_BITFIELDS

Compresión DWORD = lpBmInfo->encabezado BMI compresión bi;

if(n altura <0 ||(Compresión!= BI_RGB) )

{

Desbloqueo global (hDIB);

WaitCursorEnd();

Devolver NULL

}

LP byte lpDIBBits = FindDIBBits((LP byte)lpBmInfo);

//Convertir ángulos a radianes

#Definición PI 3.1415926

Radianes dobles=(f grados/90.0)*(PI/2);

//Calcular coseno y seno solo una vez

Coseno de punto flotante=(punto flotante) cos(radianes );

float sine = (float)sin(radianes);

//El tamaño del mapa de bits del resultado calculado

//Primero obtenga las coordenadas de división de tres esquinas fuera del origen

int x 1 =(int)(-n altura * seno);

int y 1 =(int)(n altura * coseno) ;

int x2 = (int)(nAncho *coseno - nAlto *seno);

int y2 = (int)(nAlto *coseno + nAncho *seno);

int x3 = (int)(nAncho * coseno);

int y3 = (int)(nAncho * seno);

int minx = min(0, min (x1); , min(x2, x3));

int miny = min(0, min(y1, min(y2, y3)));

int maxx = max( x1, max(x2, x3));

int maxy = max(y1, max(y2, y3));

int w = maxx-minx;

int h = maxy-miny;

//Crea un DIB para guardar los resultados

int nResultRowBytes =((((w * bpp)+31)&~ 31) / 8);

long len = nResultRowBytes * h;

int nHeaderSize =((LP byte)lpDIBBits-(LP byte)lpBmInfo);

MANEJAR hDIBResult = global alloc(GHND, len+nHeaderSize);

//Inicializar información del encabezado

LPBITMAPINFO lpBmInfoResult = (LPBITMAPINFO)global lock(hDIBResult);

memcpy((void*)lpBmInfoResult, (void*)lpBmInfo, nHeaderSize);

lpBmInfoResult->Encabezado BMI ancho bi = w;

lpBmInfoResu.

lt->Encabezado BMI. Altura BIH = h;

lpBmInfoResult->Encabezado BMI.imagen bisize = len;

LP byte lpDIBBitsResult = FindDIBBits((LP byte) lpBmInfoResult) ;

//Obtener el valor del color de fondo (índice)

ZeroMemory(lpDIBBitsResult, len);

DWORD dwBackColor

Cambiar ( bpp)

{

Caso 1://monocromo

if( clrBack == RGB(255, 255, 255))

memset(lpDIBBitsResult, 0xff, len);

Break;

Caso 4:

Caso 8://búsqueda de tabla de colores

int I;

for(I = 0;i<nColorsi++)

{

if(lpBmInfo->bmiColors[i]. Valor RGB = = getb valor(clr back)

& amp& amplpBmInfo-& gt; rgbGreen == GetGValue(clrBack)

& amp& amplpBmInfo-& gt; rgbRed == GetRValue(clrBack))

{

if(bpp == 4)I = I | <<4;

memset(lpDIBBitsResult, I, len);

Rotura;

}

}

//Si se encuentra una discrepancia, el color permanece negro

Pausa;

Caso 16:

// Windows95 admite 5 bits cada uno para todos los colores o 5 bits para el rojo.

azul

//6 bits para verde: verifique la máscara de color para RGB555 o RGB565

if(*((DWORD *)lpBmInfo->bmiColors) == 0x7c00 )

{

//El mapa de bits es RGB555

dwback color =((getr value(clr back)& gt;& gt3)& lt;& lt10) +

((getr valor(clr atrás)>>3)<<5) +

(getb valor(clr atrás)>>3 ) ;

}

Otros

{

//El mapa de bits es RGB565

dwback color =( (getr value(clr back)>>3 )<<11) +

((obtener valor(clr atrás)>>2)<<5) +

p>

(obtener valor(clr atrás)& gt; & gt3) ;

}

Rotura;

Caso 24:

Caso 32:

dwback color =(((DWORD)getr valor(clr atrás))& lt;& lt16) |

((((DWORD)GetGValue(clr atrás))<<8) |

((((DWORD)obtener valor(clr back)));

Romper;

}