Cómo crear un efecto de rotación en VC
// 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;
}