这两个API其实和GrLoadImageFromFile与GrDrawImageToFit有点异曲同工之妙,只是xxFromBuffer的两个API省去对文件I/O的操作,而直接从内存里操作罢了。换句话说,GrLoadImageFromBuffer完成的就是GrLoadImageFromFile的效果,而GrDrawImageFromBuffer完成就是GrDrawImageToFit与GrFreeImage的共同效果。
GrLoadImageFromBuffer(void *buffer, int size, int flags)
这里的*buffer是存放数据的地址,我们也从另外一个角度来理解为是我们通过open打开一个图像文件后得到一个fd,再把fd里的内容read到一块以buffer开始的内存区域中,这样我们就可以直接调用GrLoadImageFromBuffer函数,返回GR_IMAGE_ID。以下是code:
int fd, id;
char *path = "@@@"; /*三个@@@表示图片存放的绝对路径*/
struct stat s;
void *buffer = 0;
fd = open(path, O_RDONLY);
if (fd < 0 || fstat(fd, &s) < 0) {
EPRINTF("Error: can't open image: %s/n", path);
return 0;
}
buffer = malloc(s.st_size);
if (!buffer) {
EPRINTF("GdLoadImageFromFile: Couldn't malloc image %s/n", path);
close(fd);
return 0;
}
if (read(fd, buffer, s.st_size) != s.st_size) {
EPRINTF("GdLoadImageFromFile: Couldn't load image %s/n", path);
close(fd);
return 0;
}
GR_IMAGE_ID loadimageid = GrLoadImageFromBuffer(buffer, s.st_size, 0);
fprintf(stderr, "GR_IMAGE_ID is '%d'/n", loadimageid);
GrDrawImageFromBuffer(GR_DRAW_ID id, GR_GC_ID gc, GR_COORD x, GR_COORD y, GR_SIZE width, GR_SIZE height, void *buffer, int size, int flags)
知道了GrLoadImageFromBuffer的用法,也就对GrDrawImageFromBuffer不难上手了。因为*buffer的问题在GrLoadImageFromBuffer已经得到了解决,在GrDrawImageFromBuffer这里只需要直接调用便可在指定windows和指定坐标上画图。