int Retinex::Process(uchar* bitmap, size_t n, QVector<QString> argv) { if(!bitmap) return 1; QSize imgSize; imgSize.setHeight(argv.at(1).toInt()); imgSize.setWidth(argv.at(2).toInt()); //qDebug()<<imgSize; //qDebug()<<n; uchar* temp = new uchar[n]; size_t j = 0; for (size_t i = 1; i < n-1; i += 4) { temp[j++] = bitmap[i + 1]; temp[j++] = bitmap[i]; temp[j++] = bitmap[i - 1]; } retinex(temp, n, imgSize,argv.at(3).toInt()); j = 0; for (size_t i = 1; i < n-1; i += 4) { bitmap[i + 1] = temp[j++]; bitmap[i] = temp[j++]; bitmap[i - 1] = temp[j++]; } delete[] temp; return 0; }
static void run (const gchar *name, gint nparams, const GimpParam *param, gint *nreturn_vals, GimpParam **return_vals) { static GimpParam values[1]; GimpDrawable *drawable; GimpRunMode run_mode; GimpPDBStatusType status = GIMP_PDB_SUCCESS; gint x, y, width, height; run_mode = param[0].data.d_int32; INIT_I18N (); *nreturn_vals = 1; *return_vals = values; values[0].type = GIMP_PDB_STATUS; values[0].data.d_status = status; drawable = gimp_drawable_get (param[2].data.d_drawable); if (! gimp_drawable_mask_intersect (drawable->drawable_id, &x, &y, &width, &height) || width < MIN_GAUSSIAN_SCALE || height < MIN_GAUSSIAN_SCALE) { status = GIMP_PDB_EXECUTION_ERROR; gimp_drawable_detach (drawable); values[0].data.d_status = status; return; } gimp_tile_cache_ntiles (2 * (drawable->width / gimp_tile_width () + 1)); switch (run_mode) { case GIMP_RUN_INTERACTIVE: /* Possibly retrieve data */ gimp_get_data (PLUG_IN_PROC, &rvals); /* First acquire information with a dialog */ if (! retinex_dialog (drawable)) return; break; case GIMP_RUN_NONINTERACTIVE: /* Make sure all the arguments are there! */ if (nparams != 7) { status = GIMP_PDB_CALLING_ERROR; } else { rvals.scale = (param[3].data.d_int32); rvals.nscales = (param[4].data.d_int32); rvals.scales_mode = (param[5].data.d_int32); rvals.cvar = (param[6].data.d_float); } break; case GIMP_RUN_WITH_LAST_VALS: gimp_get_data (PLUG_IN_PROC, &rvals); break; default: break; } if ((status == GIMP_PDB_SUCCESS) && (gimp_drawable_is_rgb (drawable->drawable_id))) { gimp_progress_init (_("Retinex")); retinex (drawable, NULL); if (run_mode != GIMP_RUN_NONINTERACTIVE) gimp_displays_flush (); /* Store data */ if (run_mode == GIMP_RUN_INTERACTIVE) gimp_set_data (PLUG_IN_PROC, &rvals, sizeof (RetinexParams)); } else { status = GIMP_PDB_EXECUTION_ERROR; } gimp_drawable_detach (drawable); values[0].data.d_status = status; }