int convert (MagickWand *input, MagickWand **output, convert_t *opts, unsigned char* data, size_t size) { if (convert_density(input, opts) != MagickPass) return -7; if (MagickReadImageBlob(input, data, size) != MagickPass) return -2; if (convert_adjoin(input, output, opts) != MagickPass) return -8; input = *output; uint32_t quality = 75; if(opts->quality != 0){ quality = opts->quality; } if(convert_quality(input, quality) != MagickPass) return -8; MagickResetIterator(input); MagickNextImage(input); // Has to be called after MagickResetIterator to set the first picture as the current do { if (convert_format(input, opts) != MagickPass) return -3; if (convert_crop(input, opts) != MagickPass) return -6; if (convert_scale(input, opts) != MagickPass) return -4; if (convert_rotate(input, opts) != MagickPass) return -5; } while (MagickNextImage(input)); return 0; }
static int create_type9(RECORD **anrecord, struct finger_view_minutiae_record *fvmr, unsigned int idc) { FIELD *field = NULL; SUBFIELD *subfield = NULL; ITEM *item = NULL; RECORD *lrecord; // For local convenience struct finger_minutiae_data **fmds = NULL; struct ridge_count_data **rcds = NULL; struct core_data **cds; struct delta_data **dds; char buf[16]; int mincnt, minidx, rdgcnt; int cnt, i; unsigned int x, y; if (new_ANSI_NIST_record(anrecord, TYPE_9_ID) != 0) ALLOC_ERR_EXIT("Type-9 Record"); lrecord = *anrecord; /*** 9.001 - Length ***/ // Set to 0 now, will recalculate later APPEND_TYPE9_FIELD(lrecord, LEN_ID, "0"); /*** 9.002 - IDC value ***/ snprintf(buf, sizeof(buf), IDC_FMT, idc); APPEND_TYPE9_FIELD(lrecord, IDC_ID, buf); /*** 9.003 - Impression type ***/ CRW(fvmr->impression_type, MIN_TABLE_5_CODE, MAX_TABLE_5_CODE, "Impression type"); snprintf(buf, sizeof(buf), "%d", fvmr->impression_type); APPEND_TYPE9_FIELD(lrecord, IMP_ID, buf); /*** 9.004 - Minutiae format ***/ APPEND_TYPE9_FIELD(lrecord, FMT_ID, STD_STR); /*** 9.005 - Originating fingerprint reading system ***/ if (value2subfield(&subfield, "EXISTING IMAGE") != 0) ERR_OUT("creating Type-9 subfield"); if (value2item(&item, AUTO_STR) != 0) ERR_OUT("creating Type-9 item"); if (append_ANSI_NIST_subfield(subfield, item) != 0) ERR_OUT("appending Type-9 item"); if (new_ANSI_NIST_field(&field, TYPE_9_ID, OFR_ID) != 0) ERR_OUT("creating Type-9 field"); if (append_ANSI_NIST_field(field, subfield) != 0) ERR_OUT("appending Type-9 subfield"); if (append_ANSI_NIST_record(lrecord, field) != 0) ERR_OUT("appending Type-9 field"); /*** 9.006 - Finger position ***/ snprintf(buf, sizeof(buf), "%02d", fvmr->finger_number); APPEND_TYPE9_FIELD(lrecord, FGP2_ID, buf); /*** 9.007 - Fingerprint pattern classification ***/ if (value2subfield(&subfield, TBL_STR) != 0) ERR_OUT("creating Type-9 subfield"); if (value2item(&item, "UN") != 0) ERR_OUT("creating Type-9 item"); if (append_ANSI_NIST_subfield(subfield, item) != 0) ERR_OUT("appending Type-9 item"); if (new_ANSI_NIST_field(&field, TYPE_9_ID, FPC_ID) != 0) ERR_OUT("creating Type-9 field"); if (append_ANSI_NIST_field(field, subfield) != 0) ERR_OUT("appending Type-9 subfield"); if (append_ANSI_NIST_record(lrecord, field) != 0) ERR_OUT("appending Type-9 field"); /*** 9.008 - Core position ***/ cnt = get_core_count(fvmr); if (cnt > 0) { if (new_ANSI_NIST_field(&field, TYPE_9_ID, CRP_ID) != 0) ERR_OUT("allocating field"); cds = (struct core_data **) malloc( cnt * sizeof(struct core_data **)); if (cds == NULL) ALLOC_ERR_EXIT("Core data"); if (get_cores(fvmr, cds) != cnt) ERR_OUT("retrieving core data"); for (i = 0; i < cnt; i++) { convert_xy(fvmr->fmr->x_image_size, fvmr->fmr->y_image_size, fvmr->fmr->x_resolution, fvmr->fmr->y_resolution, cds[i]->x_coord, cds[i]->y_coord, &x, &y); snprintf(buf, sizeof(buf), "%04u%04u", x, y); if (value2subfield(&subfield, buf) != 0) ERR_OUT("creating subfield"); if (append_ANSI_NIST_field(field, subfield) != 0) ERR_OUT("appending subfield"); } if (append_ANSI_NIST_record(lrecord, field) != 0) ERR_OUT("adding field to record"); } else if (cnt < 0) ERR_OUT("getting core record count"); /*** 9.009 - Delta(s) position ***/ cnt = get_delta_count(fvmr); if (cnt > 0) { if (new_ANSI_NIST_field(&field, TYPE_9_ID, DLT_ID) != 0) ERR_OUT("creating Type-9 field"); dds = (struct delta_data **) malloc( cnt * sizeof(struct delta_data **)); if (dds == NULL) ALLOC_ERR_EXIT("Delta data"); if (get_deltas(fvmr, dds) != cnt) ERR_OUT("retrieving delta data"); for (i = 0; i < cnt; i++) { convert_xy(fvmr->fmr->x_image_size, fvmr->fmr->y_image_size, fvmr->fmr->x_resolution, fvmr->fmr->y_resolution, dds[i]->x_coord, dds[i]->y_coord, &x, &y); snprintf(buf, sizeof(buf), "%04u%04u", x, y); if (value2subfield(&subfield, buf) != 0) ERR_OUT("creating subfield"); if (append_ANSI_NIST_field(field, subfield) != 0) ERR_OUT("appending subfield"); } if (append_ANSI_NIST_record(lrecord, field) != 0) ERR_OUT("adding field to record"); } else if (cnt < 0) ERR_OUT("getting delta record count"); /*** 9.010 - Number of minutiae ***/ mincnt = get_fmd_count(fvmr); if (mincnt < 0) ERR_OUT("getting minutiae count"); snprintf(buf, sizeof(buf), "%d", mincnt); APPEND_TYPE9_FIELD(lrecord, MIN_ID, buf); /*** 9.011 - Minutiae ridge count indicator ***/ rdgcnt = get_rcd_count(fvmr); if (rdgcnt > 0) { rcds = (struct ridge_count_data **) malloc( rdgcnt * sizeof(struct ridge_count_data **)); if (rcds == NULL) ALLOC_ERR_EXIT("Ridge Count data"); if (get_rcds(fvmr, rcds) != rdgcnt) ERR_OUT("retrieving ridge count data"); APPEND_TYPE9_FIELD(lrecord, RDG_ID, "1"); } else if (rdgcnt < 0) ERR_OUT("getting ridge record count"); else APPEND_TYPE9_FIELD(lrecord, RDG_ID, "0"); /*** 9.012 - Minutiae and ridge count data ***/ fmds = (struct finger_minutiae_data **) malloc( mincnt * sizeof(struct finger_minutiae_data **)); if (fmds == NULL) ALLOC_ERR_EXIT("Finger Minutiae data"); if (get_fmds(fvmr, fmds) != mincnt) ERR_OUT("retrieving minutiae data"); if (new_ANSI_NIST_field(&field, TYPE_9_ID, MRC_ID) != 0) ERR_OUT("creating Type-9 field"); for (minidx = 0; minidx < mincnt; minidx++) { unsigned int theta, rdgidx, minqual; char mintype; int idxnum = minidx + 1; // Index number snprintf(buf, sizeof(buf), "%03d", idxnum); if (value2subfield(&subfield, buf) != 0) ERR_OUT("creating Type-9 subfield"); // X, Y, and theta values convert_xy(fvmr->fmr->x_image_size, fvmr->fmr->y_image_size, fvmr->fmr->x_resolution, fvmr->fmr->y_resolution, fmds[minidx]->x_coord, fmds[minidx]->y_coord, &x, &y); convert_theta(fmds[minidx]->angle, &theta); snprintf(buf, sizeof(buf), "%04u%04u%03u", x, y, theta); if (value2item(&item, buf) != 0) ERR_OUT("creating Type-9 item"); if (append_ANSI_NIST_subfield(subfield, item) != 0) ERR_OUT("appending Type-9 item"); // Quality measure convert_quality(fmds[minidx]->quality, &minqual); snprintf(buf, sizeof(buf), "%u", minqual); if (value2item(&item, buf) != 0) ERR_OUT("creating Type-9 item"); if (append_ANSI_NIST_subfield(subfield, item) != 0) ERR_OUT("appending Type-9 item"); // Minutia type designation convert_type(fmds[minidx]->type, &mintype); snprintf(buf, sizeof(buf), "%c", mintype); if (value2item(&item, buf) != 0) ERR_OUT("creating Type-9 item"); if (append_ANSI_NIST_subfield(subfield, item) != 0) ERR_OUT("appending Type-9 item"); // Ridge count data: If the one of the index numbers // in the record matches the minutia index, then add that // ridge count data to the Type-9 record, using the index // number that is the 'other'. for (rdgidx = 0; rdgidx < rdgcnt; rdgidx++) { if ((rcds[rdgidx]->index_one == idxnum) || (rcds[rdgidx]->index_two == idxnum)) { snprintf(buf, sizeof(buf), "%u,%u", (rcds[rdgidx]->index_one == idxnum) ? rcds[rdgidx]->index_two : rcds[rdgidx]->index_one, rcds[rdgidx]->count); if (value2item(&item, buf) != 0) ERR_OUT("creating Type-9 item"); if (append_ANSI_NIST_subfield(subfield, item) != 0) ERR_OUT("appending Type-9 item"); } } if (append_ANSI_NIST_field(field, subfield) != 0) ERR_OUT("appending Type-9 subfield"); } free(fmds); if (append_ANSI_NIST_record(lrecord, field) != 0) ERR_OUT("appending Type-9 field"); /*** End of minutiae and ridge count */ // Calculate and update the record length field if (update_ANSI_NIST_tagged_record_LEN(lrecord) != 0) ERR_OUT("updating Type-9 record length"); return 0; err_out: fprintf(stderr, "Error creating Type-9 record\n"); if (item != NULL) free_ANSI_NIST_item(item); if (subfield != NULL) free_ANSI_NIST_subfield(subfield); if (field != NULL) free_ANSI_NIST_field(field); if (lrecord != NULL) free_ANSI_NIST_record(lrecord); if (fmds != NULL) free(fmds); return -1; }