/*********************************************************************************** * * * Programa: black2alfa v2.1 (c) Angel Soria 1994 * * * * Crea un canal alfa de una imagen PICT tomando el color negro transparente * * * ***********************************************************************************/ #include #include #include #include #include /* pict.h (c) SPD Soft */ #ifdef MAC #include "console.h" /* !! Solo para pruebas en MacIntosh !! */ /* Debe definirse en el proyecto: MAC */ #endif /* Hay que declarar MAC. */ #define MAXCAD 100 /* Longitud maxima de las cadenas +1 */ #define TRUE 1 /* Para poder trabajar con booleanos */ #define FALSE 0 /* Para poder trabajar con booleanos */ #define MALLOC(n,x) ((x*)malloc((n)*sizeof(x))) /***********************************************************************************/ void error(mensaje1,mensaje2) char *mensaje1,*mensaje2; /***********************************************************************************/ /* Da un mensaje de error.*/ /*------------------------*/ { printf("\tERROR: %s%s.\n",mensaje1,mensaje2); } /***********************************************************************************/ /* Programa Principal */ /***********************************************************************************/ main(argc,argv) int argc; char *argv[]; { Pict pict1; /* Fichero PICT original 1. */ Pict pict; /* Fichero PICT resultante. */ char nomb1[MAXCAD]; /* Nombre del fichero pict1. */ char nomb[MAXCAD]; /* Nombre del fichero pict. */ U_char *pix1; /* Puntos que forman la linea origen en curso1 */ U_char *pix; /* Puntos que forman la linea resultante */ int lx1,ly1; /* Tama–o de la picture1. */ int mode1; /* Modo de las imagenes de entrada */ int ncmp1; /* Numero de componenetes de color */ int y; /* Linea en proceso. */ int i; /* Pixel de la linea en curso. */ int j; /* Componente de la linea en curso. */ int verb,black; /* Mode */ float black_f; float aux_f; /* Porcentaje del fichero que se ha tratado */ int aux1,aux2,aux3; /* Variables auxiliares. */ int al1,aux4; /* Variables auxiliares. */ U_char res; /* Variables auxiliares. */ #ifdef MAC argc = ccommand(&argv); #endif verb=TRUE; black=0; if ( (argc>2) && (!strcmp(*++argv,"-v"))) { --argc; verb=FALSE; } else --argv; if ( (argc>2) && (!strncmp(*++argv,"-b", 2))) { --argc; sscanf(*argv,"-b%i",&black); black_f = (float)black / 100.0; } else --argv; if (verb) { printf("\n### Ejecutando black2alfa v2.1 ###\n"); printf("\nCreaci—n de canal alfa para PICT«s.\n"); printf("(c) 1994 Angel Soria.\n\n"); if (black!=0) printf(" Alfa hasta el %i%% de Brillo.\n\n",black); } if (argc<3) { error("Faltan parametros.",""); printf("\nUso: black2alfa [-v -bnnn] [fuente resultado].\n\n"); printf("Se crea el canal alfa de resultado usando el brillo\n"); printf("de la imagen fuente para calcular el alfa.\n\n"); printf("fuente debe estar en formato RGB.\n\n"); printf("-v indica sin comentarios, \n"); printf("-bnnn especifica en nnn de 0 a 100 el valor de brillo \n"); printf("por debajo del cual se toman transparencias.\n"); exit(1); } /* Abro el fichero */ /*-----------------*/ strcpy(nomb1,*++argv); if( (pict1=pict_open(nomb1,P_READ,0,0,0,NULL))==NULL) { error("Imposible abrir: ",nomb1); goto salir1; } lx1=pict_width(pict1); ly1=pict_height(pict1); mode1=pict_mode(pict1); ncmp1=pict_n_comp(pict1); al1=ncmp1-3; if ( (mode1==M_MONO)||(mode1==M_RGB8) ) { error("Modo no soportado en:",nomb1); goto salir2; } /* Abro la nueva */ /*---------------*/ strcpy(nomb,*++argv); if( (pict=pict_open(nomb,P_WRITE,ly1,lx1,M_RGBA32,NULL))==NULL) { error("Imposible crear: ",nomb); goto salir3; } /* Reserva memoria */ /*-----------------*/ if( (pix1 = MALLOC(lx1*ncmp1,U_char)) == NULL) { error("Imposible crear espacio en memoria para Datos",""); goto salir4; } if( (pix = MALLOC(lx1*4,U_char)) == NULL) { error("Imposible crear espacio en memoria para Datos",""); goto salir4; } /* Bucle para generar el resultado */ /*---------------------------------*/ if (verb) printf("Generando \"%s\"... 00 %% \r",nomb); aux4=0; for(y=0; y30) && verb ) { aux4=0; aux_f=100.0*(y+1.0)/ly1; printf("Generando \"%s\"... %02.0f %% \r",nomb,aux_f); } } if (verb) printf("Generando \"%s\"... 100 %% \n",nomb); salir4: pict_close(pict); salir3: salir2: pict_close(pict1); salir1: if (verb) printf("\n### black2alfa Finalizado ###\n\n"); }