VL_EXPORT int vl_pgm_write (char const *name, vl_uint8 const* data, int width, int height) { int err = 0 ; VlPgmImage pgm ; VlThreadSpecificState * threadState = vl_get_thread_specific_state() ; FILE *f = fopen (name, "wb") ; if (! f) { snprintf(threadState->lastErrorMessage, VL_ERR_MSG_LEN, "Error opening PGM file for writing") ; return (threadState->lastError = VL_ERR_MSG_LEN) ; } pgm.width = width ; pgm.height = height ; pgm.is_raw = 1 ; pgm.max_value = 255 ; err = vl_pgm_insert (f, &pgm, data) ; fclose (f) ; return err ; }
/** @brief Save octave on disk ** @internal **/ static int save_gss (VlSiftFilt * filt, VlFileMeta * fm, const char * basename, int verbose) { char tmp [1024] ; int S = filt -> S ; int q, i ; int s, err ; int w, h ; int o = filt -> o_cur ; VlPgmImage pim ; vl_uint8 *buffer = 0 ; if (! fm -> active) { return VL_ERR_OK ; } w = vl_sift_get_octave_width (filt) ; h = vl_sift_get_octave_height (filt) ; pim.width = w ; pim.height = h ; pim.max_value = 255 ; pim.is_raw = 1 ; buffer = malloc (sizeof(vl_uint8) * w * h) ; if (! buffer) { err = VL_ERR_ALLOC ; goto save_gss_quit ; } q = vl_string_copy (tmp, sizeof(tmp), basename) ; if (q >= sizeof(tmp)) { err = VL_ERR_OVERFLOW ; goto save_gss_quit ; } for (s = 0 ; s < S ; ++s) { vl_sift_pix * pt = vl_sift_get_octave (filt, s) ; /* conversion */ for (i = 0 ; i < w * h ; ++i) { buffer [i] = (vl_uint8) pt [i] ; } /* save */ snprintf(tmp + q, sizeof(tmp) - q, "_%02d_%03d", o, s) ; err = vl_file_meta_open (fm, tmp, "wb") ; if (err) goto save_gss_quit ; err = vl_pgm_insert (fm -> file, &pim, buffer) ; if (err) goto save_gss_quit ; if (verbose) { printf("sift: saved gss level to '%s'\n", fm -> name) ; } vl_file_meta_close (fm) ; } save_gss_quit : ; if (buffer) free (buffer) ; vl_file_meta_close (fm) ; return err ; }