(edit by king)由于性能测试需要,需要准备大量不相同的图片(图片md5值不同),为了方便的创建这些图片,写了个小程序来完成这个工作。
这个程序最初的算法是生成一张指定长和宽的图片,然后一个个像素置成特定的颜色。因为最终要生成jpg文件,这样的做法,会导致生成的图片普遍比较小,最终确定为从参数中获得一个种子文件,然后对每个像素进行反色处理。
主要的计算方法如下:
jpgInFile = fopen(param_p->fileName, "rb");
if(jpgInFile == NULL)
{
perror("open seed file");
return NULL;
}
im = gdImageCreateFromJpeg(jpgInFile);
fclose(jpgInFile);
width = gdImageSX(im);
height = gdImageSY(im);
pch = strrchr(param_p->fileName, '.');
strncpy(fileBase, param_p->fileName, pch - param_p->fileName);
for(n = param_p->start; n < param_p->end; ++n)
{
color = gdImageGetPixel(im, n % width, (n / width) % height);
revertColor = gdImageColorAllocate(im, 0xFF - gdImageRed(im, color),
0xFF - gdImageGreen(im, color), 0xFF - gdImageBlue(im, color));
gdImageSetPixel(im, n % width, (n / width) % height, revertColor);
sprintf(fileName, "%s%d.jpg", fileBase, n);
jpgOutFile = fopen(fileName, "wb");
gdImageJpeg(im, jpgOutFile, 60);
fclose(jpgOutFile);
}
反色的方法很简单,分别用0xFF减去像素点的RGB分色就可以了。这里使用了gd库来操作图片,具体gd库的API,可以看http://www.libgd.org/Reference
。
还有个问题,就是“大量”。刚开始还在纠结于用多线程还是多进程,看了下发现多进程非常不便于任务分派,最后还是决定是用多线程来加快图片的创建。
先定义一个结构来保存传递给线程函数的参数:
typedef struct
{
char *fileName;
int start;
int end;
}param;
分别代表种子图片文件名、开始像素点和结束像素点。
for(n = 0; n < threadCount; ++n)
{
paramArray[n].fileName = fileName;
paramArray[n].start = createPerThread * n;
paramArray[n].end = createPerThread * (n + 1);
ret = pthread_create(&threads[n], &attr, &do_create_image, ¶mArray[n]);
if(ret != 0)
{
perror("thread create");
exit(EXIT_FAILURE);
}
}
for(n = 0; n < threadCount; ++n)
{
ret = pthread_join(threads[n], NULL);
if(ret != 0)
{
perror("thread join");
exit(EXIT_FAILURE);
}
}
是用pthread_create和pthread_join进行线程的创建和等待结束,是用多线程的方式大大增加了图片创建的速度,采用O2优化程度编译的代码,可以在13分钟创建1万张图片。
最后,还是用了getopt函数来获得从命令行传入的参数。while((ret = getopt(argc, argv, "s:t:f:")) != -1)
while((ret = getopt(argc, argv, "s:t:f:")) != -1)
{
switch(ret)
{
case 's':
totalCount = atoi(optarg);
break;
case 't':
threadCount = atoi(optarg);
break;
case 'f':
strncpy(fileName, optarg, 256);
break;
default:
fprintf(stderr, "usage: %s [-s SUM] [-t THREAD_COUNT] [-f SEED_FILE]\n", argv[0]);
exit(EXIT_FAILURE);
}
}
因为这个小程序使用了gd库、pthread库,因此在编译的时候,需要连接着两个库。
CC = gcc
FLAGS = -O2
LIBS = -lpthread -lgd
EXE = jpg
all: $(EXE)
jpg: jpg_creator.c
$(CC) $(FLAGS) -o $@ $? $(LIBS)
clean:
rm $(EXE)
分享到:
相关推荐
微信小程序demo:柏拉图测试:趣味图片生成器(源代码+截图)微信小程序demo:柏拉图测试:趣味图片生成器(源代码+截图)微信小程序demo:柏拉图测试:趣味图片生成器(源代码+截图)微信小程序demo:柏拉图测试:趣味...
针对现在流行的个性化二维码增加了二维码LOGO图片信息,说明如下: 1. 选择属于自己个性化的LOGO图片信息,生成的图片中包含此图片 2. 在二维码中加入个人的主页,别人扫描后可以...3. 通过ZXING方式生成,程序安全稳定
通过微信小程序接口,生成带参数的二维码,并下载之本地返回二维码图片地址
小程序生成二维码并且把二进制流转换图片
基本thinkphp6的上传excel批量生成不同参数的小程序码,并对生成的小程序码图片进行图片处理
主要介绍了微信小程序将字符串生成二维码图片的操作方法,需要的朋友可以参考下
需求:小程序获取到微信头像和昵称,生成2019年随机发生的趣事 实现:微信小程序实现 用canvas 生成图片 并保存
uni-app微信小程序生成海报
java后台生成小程序海报、小程序分享图 png不变黑,java生成微信小程序分享图海报图的全过程 可作为util直接使用
C#二维码图片生成,二维码图片解码含源代码 比较适合初学和进阶学者,使用的是com.google.zxing.common库 将指定的文字或数字生成二维码图片 将生成的二维码图二内容进行解码成对应的文字或数字。 可进行设置图片的...
今天用uniapp写小程序二维码并保存到本地,网上的完全没有用,最后自己写了一个, 1.使用weapp.qrcode生成二维码,并使用uni.canvasToTempFilePath生成临时图片文件, 2.使用canvas绘制二维码, 3.使用uni....
poster 是后端生成海报图片的一种简单方式,其适用于微信小程序海报分享,保存到相册后可以分享到朋友圈。
小程序生成图片
用于微信小程序生成海报,可调节图片大小,内容自定义,位置等属性,打开即用
微信小程序之通过Canvas生成图片保存到手机相册
微信小程序,生成logo二维码保存图片;或者在canvas某一部位绘制二维码
智能AI-图片-视频自动生成ChatGPT3.5版本微信小程序源码 模块包含:智能AI、免费专区、优惠专区以及我的中心四大模块 主要功能: 1)AI对话 2)英文翻译 3)智能绘图 4)智能图片生成 5)全网视频去水印:支持...
微信小程序获取小程序页面二维码API接口,通过后台post网址https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=ACCESS_TOKEN, 获取access_token方式,参数{"path": "pages/index/index?query=...