图像特效之连环画
关键代码:
int Comic(IMAGE_TYPE *BMP24_img)
{
DWORD width,height,i,j,bfsize;
WORD biBitCount;
T_U8 *dst,*bmp,*img_data;
int pix,R,G,B,gray;
T_U32 line_byte,Imgindex;
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
FILE *Comic_fp = fopen("Comic.bmp","wb");
if(NULL == Comic_fp)
{
printf("Can't open Comic.bmp\n");
return -1;
}
memset(&bf, 0, sizeof(bf));
memset(&bi, 0, sizeof(bi));
bmp = BMP24_img;
memcpy(&bf,bmp,14);
memcpy(&bi,&bmp[14],40);
fwrite(&bf,sizeof(BITMAPFILEHEADER),1,Comic_fp);
fwrite(&bi,sizeof(BITMAPINFOHEADER),1,Comic_fp);
height = bi.biHeight;
width = bi.biWidth;
bfsize = bf.bfSize;
biBitCount = bi.biBitCount;
line_byte = WIDTHBYTES(width*bi.biBitCount);
img_data = bmp+54;
dst = (T_U8 *)malloc(line_byte*height);
memset(dst,0,line_byte*height);
memcpy(dst,img_data,line_byte*height);
for (i = 0;i < height;i++)
{
for (j = 0; j < width;j++)
{
Imgindex = i*line_byte+3*j;
R = img_data[Imgindex+2];
G = img_data[Imgindex+1];
B = img_data[Imgindex];
pix = G-B+G+R;
if (pix < 0) pix = -pix;
pix = pix * R / 256;
if(pix > 255) pix = 255;
dst[Imgindex+2] = (T_U8)pix;
pix = B-G+B+R;
if (pix < 0) pix = -pix;
pix = pix * R / 256;
if(pix > 255) pix = 255;
dst[Imgindex+1] = (T_U8)pix;
pix = B-G+B+R;
if (pix < 0) pix = -pix;
pix = pix * G / 256;
if(pix > 255) pix = 255;
dst[Imgindex] = (T_U8)pix;
}
}
for (i = 0; i < height;i++)
{
for (j = 0;j <width;j++)
{
Imgindex = i*line_byte+3*j;
R = dst[Imgindex+2];
G = dst[Imgindex+1];
B = dst[Imgindex];
gray = (T_U8)((19661 * R + 38666 * G + 7209 * B) >> 16);
dst[Imgindex] = dst[Imgindex+1] = dst[Imgindex+2] = gray;
}
}
fwrite(dst,line_byte*height,1,Comic_fp);
fclose(Comic_fp);
Comic_fp = NULL;
free(dst);
return 0;
}
图像效果: