¿Cómo ajustar imágenes PCX usando programación en lenguaje C?
Estación, regrese y lo ayude a verlo. He hecho esta imagen PCX antes. Esto es más problemático. Debe conocer la estructura de la imagen, encontrar los datos correspondientes y invertir los datos (. en realidad, el índice de la rueda de color). OK
Por supuesto, puede mover la posición. Modifique el índice de la rueda de color correspondiente en los datos.
Luego guárdelo en la imagen en formato .pcx. estará bien
Busque la estructura de imágenes de PCX en Internet. Si no puede encontrarla, puedo enviarle una cuando llegue a casa hoy
//Eso es todo en su mayor parte, pero no funcionó para mí. El ancho y el alto simplemente no se pudieron mostrar normalmente, lo cual fue muy. frustrante. Lo miré, por desgracia, tomó dos días, qué mal.....
#includelt;io.hgt;
#includelt;stdio.hgt;
#includelt;dos.hgt;
#includelt;string.hgt;
#includelt;math.hgt;
# includelt;stdio.hgt;
#includelt;fcntl .hgt;
#includelt;stdlib.hgt;
#includelt;conio.hgt; p>
#definir PCX_HEIGHT 240
#definir PCX_WIDTH 320
#definir PCS_OTHERDATA 500
#definir OPEN_PCX_PATH "d:\\0.pcx"
#define SAVE_PCX_PATH "d:\\00. pcx"
//======================= ==================== =============================== ===
//Esta institución tiene ***128 entidades Byte
typedef struct pcx_header_typ
{
char manufacturer;
versión char;
codificación char;
char bits_per_pixel;
int x, y
int ancho; , altura;
int horz_res, vert_res;
char ega_palette[48];
char reservado;
char num_color_planes; p>
int bytes_per_line;
int paleta_type;
char padding[58];
} pcx_header, *pcx_header_ptr;
//================ ================================ =================== ======
//Estructura de la placa de color
typedef struct RGB_color_typ
{
cancelar la firma
d carbón rojo;
verde carbón sin firmar
azul carbón sin firmar
} RGB_color, *RGB_color_ptr; ==================================================== ====================
//La estructura real de la imagen PCX
typedef struct pcx_picture_typ
{
encabezado pcx_header
paleta de colores RGB[256];
char *buffer
} pcx_picture, *pcx_picture_ptr;
//========================================; == ===============================
carácter sin firmar *buffer=NULL;
Paleta_color_RGB[256]={0};
//============================ === ============================================
// Obtener datos de imagen PCX
void PCX_GetData(char *filename, int enable_palette);
//Mostrar mensaje
void show_title(int * x0 , int *y0, int *x1, int *y1);
//Recorta la imagen y guárdala
void cut_picAndsave();
/ /= ================================================== == =====================
int main(void)
{
char * pcx=OPEN_PCX_PATH
int x0=0, y0=0, x1=0, y1=0;
buffer=(carbón sin firmar*)malloc((PCX_HEIGHT*PCX_WIDTH PCS_OTHERDATA) *tamaño de (carácter sin firmar));
memset(búfer, 0, (PCX_HEIGHT*PCX_WIDTH PCS_OTHERDATA)*tamaño de (carácter sin firmar));
PCX_GetData(pcx, 1) ;
show_title(amp;x0,amp;y0,amp;x1,amp;y1);
cut_picAndsave(x0,y0,x1,y1);
getch();
devuelve 0;
}
//================== === ================================================= === ===<
/p>
void PCX_GetData(char *nombre de archivo, int enable_palette)
{
ARCHIVO *fp = NULL
int num_bytes = 0, índice; = 0;
recuento de int largo sin firmar = 0;
datos de caracteres sin firmar
fp = fopen(nombre de archivo, "rb");
// Primero lee los primeros 128 bytes del archivo PCX para almacenar diversa información sobre el archivo
fseek(fp, 128L, SEEK_SET);
//Descomprime el PCX file
p>while(countlt;=(unsigned long int)PCX_WIDTH * PCX_HEIGHT)
{
// Leer un byte
data = getc(fp);
// Si el byte leído está entre 192-255, resta 192 para obtener el número de repeticiones de color del siguiente byte
if ( datagt;=192 & datalt;=255)
{
num_bytes = datos-192
datos = getc(fp);
p>
while(num_bytes--gt; 0)
{
buffer[count]=datos;
}
}
// Si está entre 0-191, lee el siguiente byte directamente
else
{
buffer [recuento ]=datos;
}
}
para (índice=0; indexlt; 256; índice )
{
// Leer rojo
paleta[index].red = (getc(fp) gt; gt; 2
// Leer verde
paleta[index].green = (getc(fp) gt; gt; 2
// Leer azul
paleta[index].blue = (getc); ( fp) gt; gt; 2);
}
fclose(fp); = =================================================== = ==================
void show_title(int *x0, int *y0, int *x1, int *y1)
{
printf("Ingrese la coordenada x de la esquina superior izquierda del gráfico deseado: "
scanf("d",
);printf( "Ingrese la coordenada y de la esquina superior izquierda del gráfico deseado:");
scanf("d", y0);
printf("Ingrese la coordenada x de la esquina superior izquierda del gráfico requerido:
scanf("d", x1); );
p>printf("Ingrese la coordenada y de la esquina superior izquierda del gráfico requerido: ");
scanf("d",
}
//===================================== ========== =========================
void cut_picAndsave(int x0, int y0 , int x1, int y1)
{
unsigned char *buf=(unsigned char*)malloc((x1-x0)*(y1-y0));
carácter sin firmar *buf0=( carácter sin firmar*)malloc((x1-x0)*(y1-y0));
pcx_header hpcx={0};
long int i=x0, j=0, watch=0, count=0, temp0, temp1
ARCHIVO *fp
memset(buf, 0, (x1-x0; )*(y1-y0));
memset(buf0, 0, (x1-x0)*(y1-y0));
while(buffer[i])
{
if (iPCX_WIDTHgt;=x0amp;amp;iPCX_WIDTHlt;=x1amp;amp;
i/PCX_WIDTHgt;=y0amp;amp;i/PCX_WIDTHlt; =y1)
{
buf[j ]=búfer[i]
}
if (j==(x1; -x0)*(y1-y0))
{
descanso
}
i; > }
memset (amp; hpcx, 0, sizeof(pcx_header));
hpcx.manufacturer=0x0A;
hpcx.version=0x05; /p>
hpcx.encoding= 0x01;
hpcx.bits_per_pixel=0x08;
hpcx.x=0;
hpcx.width=x1-x0-1;
hpcx.height=y1-y0-1;
hpcx.horz_res=100; p>
hpcx.vert_res=200 ; //y1-y0;
hpcx.num_color_planes =1;
hpcx.palette_type =1; hpcx.bytes_per_line=40;
i=0;
j=0;
fp=fopen(SAVE_PCX_PATH, "wb");
fwrite(amp; hpcx, 128,1,fp);
w
hile(ilt; (x1-x0)*(y1-y0))
{
count=0;
while(buf[i]== buf[i 1])
{
cuenta
i
}
si (cuentagt; ;0)
{
buf0[j ]=cuenta 192
}
buf0[j ]=buf[i] ;
i ;
}
fwrite(buf0, j, 1, fp);
fprintf(fp, "c"); , 0xc0);
fwrite(paleta, tamaño de(paleta), 1, fp> fclose(fp);