#include #include #include #include #include #include #define DEFAULT_TEXT "http:/""/upsuper.org/" int main(int argc, char **argv) { int i, j; int scale; QRecLevel level; char *text; // 设置默认参数 scale = 8; level = QR_ECLEVEL_Q; text = (char *)malloc(strlen(DEFAULT_TEXT) + 1); strcpy(text, DEFAULT_TEXT); // 读取参数 const char *orig; char *query_string; char *p; int len; orig = getenv("QUERY_STRING"); len = strlen(orig); query_string = (char *)malloc(len + 2); *query_string = '&'; strcpy(query_string + 1, orig); for (p = query_string; *p; ++p) { if (*p != '&') continue; if (strncasecmp(p + 1, "scale=", 6) == 0) { scale = atol(p + 7); } else if (strncasecmp(p + 1, "text=", 5) == 0) { char *p_last, *p_src, *p_dest; for (p_last = p + 6; *p_last && *p_last != '&'; ++p_last); text = (char *)realloc((void *)text, p_last - p - 6 + 1); for (p_src = p + 6, p_dest = text; p_src < p_last; ++p_src, ++p_dest) { if (*p_src == '+') { *p_dest = ' '; } else if (*p_src == '%') { int code; if (sscanf(p_src + 1, "%2x", &code) != 1) code = '?'; *p_dest = code; p_src += 2; } else { *p_dest = *p_src; } } *p_dest = '\0'; } else if (strncasecmp(p + 1, "level=", 6) == 0) { switch (*(p + 7)) { case 'l': case 'L': level = QR_ECLEVEL_L; break; case 'm': case 'M': level = QR_ECLEVEL_M; break; case 'q': case 'Q': level = QR_ECLEVEL_Q; break; case 'h': case 'H': level = QR_ECLEVEL_H; break; } } } // 生成 QR code QRcode *qrcode; int width; qrcode = QRcode_encodeString8bit(text, 0, level); width = qrcode->width; // 初始化 Image Magick ImageInfo *image_info; ExceptionInfo exception; InitializeMagick(*argv); GetExceptionInfo(&exception); // 初始化图片 Image *image, *resized_image; image_info = CloneImageInfo((ImageInfo *)NULL); image = AllocateImage(image_info); image->columns = image->rows = width; // 生成图片 PixelPacket *pixel_packet; int t_bit; for (i = 0; i < width; ++i) { pixel_packet = SetImagePixels(image, 0, i, width, 1); if (! pixel_packet) break; for (j = 0; j < width; ++j, ++pixel_packet) { t_bit = ! (qrcode->data[i * width + j] & 1); pixel_packet->red = MaxRGB * t_bit; pixel_packet->green = MaxRGB * t_bit; pixel_packet->blue = MaxRGB * t_bit; } if (! SyncImagePixels(image)) break; } QRcode_free(qrcode); // 处理图片 resized_image = ScaleImage(image, width * scale, width * scale, &exception); DestroyImage(image); CompressImageColormap(resized_image); // 输出图片 puts("Content-Type: image/png"); puts(""); strcpy(resized_image->filename, "png:-"); WriteImage(image_info, resized_image); // 清理 DestroyImage(resized_image); DestroyImageInfo(image_info); DestroyExceptionInfo(&exception); DestroyMagick(); return 0; }