Applica l'effetto di scala di grigi a Image utilizzando NDK (C / C ++) in Android

Voglio applicare l'effetto di scala di grigi all'image utilizzando NDK.

Per questo ho fatto molto googled ma ho trovato lo stesso risultato che restituisce l'image in qualche modo negativo (questo è quello che credo).

  • Traduzioni simultanee in Android
  • android_id per guidare le sessioni
  • Aggiunta di immagini / icone extra a CardFragment (Android Wear)
  • android LocationManager.requestLocationUpdates con minTime> 0 non funziona come previsto
  • Registrazione di chiamate telefoniche su Android
  • Problema di Android appCompat con samsung e wiko
  • Quello che voglio ::

    Per esempio ::

    Ho questa image originale

    immettere qui la descrizione dell'immagine

    Dopo aver applicato l'effetto di scala di grigi, dovrebbe essere così:

    immettere qui la descrizione dell'immagine

    Quello che ho provato:

    Voglio raggiungere questa funzionalità utilizzando NDK, per cui ho creato una function nel file .ppp

    JNIEXPORT void JNICALL Java_com_example_ndksampleproject_MainActivity_jniConvertToGray(JNIEnv * env, jobject obj, jobject bitmapcolor,jobject bitmapgray) { AndroidBitmapInfo infocolor; void* pixelscolor; AndroidBitmapInfo infogray; void* pixelsgray; int ret; int y; int x; LOGI("convertToGray"); if ((ret = AndroidBitmap_getInfo(env, bitmapcolor, &infocolor)) < 0) { LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret); return; } if ((ret = AndroidBitmap_getInfo(env, bitmapgray, &infogray)) < 0) { LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret); return; } LOGI("color image :: width is %d; height is %d; stride is %d; format is %d;flags is %d",infocolor.width,infocolor.height,infocolor.stride,infocolor.format,infocolor.flags); if (infocolor.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { LOGE("Bitmap format is not RGBA_8888 !"); return; } LOGI("gray image :: width is %d; height is %d; stride is %d; format is %d;flags is %d",infogray.width,infogray.height,infogray.stride,infogray.format,infogray.flags); if (infogray.format != ANDROID_BITMAP_FORMAT_A_8) { LOGE("Bitmap format is not A_8 !"); return; } if ((ret = AndroidBitmap_lockPixels(env, bitmapcolor, &pixelscolor)) < 0) { LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret); } if ((ret = AndroidBitmap_lockPixels(env, bitmapgray, &pixelsgray)) < 0) { LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret); } LOGI("unlocking pixels height = %d",infocolor.height); // modify pixels with image processing algorithm for (y=0;y<infocolor.height;y++) { argb * line = (argb *) pixelscolor; uint8_t * grayline = (uint8_t *) pixelsgray; for (x=0;x<infocolor.width;x++) { grayline[x] = 0.3 * line[x].red + 0.59 * line[x].green + 0.11*line[x].blue; } pixelscolor = (char *)pixelscolor + infocolor.stride; pixelsgray = (char *) pixelsgray + infogray.stride; } LOGI("unlocking pixels"); AndroidBitmap_unlockPixels(env, bitmapcolor); AndroidBitmap_unlockPixels(env, bitmapgray); } 

    La function di cui sopra mi restituisce il risultato come questo ::

    immettere qui la descrizione dell'immagine

    Questo effetto sembra qualcosa di negativo di image.

    Lasciathemes sapere se u bisogno di qualcosa dal mio fianco .. Aiutaci a risolvere questo problema come ho bloccato in questo da molte ore.

    Molte grazie in anticipo…

    EDIT ::

    Suggerimento di floppy12 ::

     for (y=0;y<infocolor.height;y++) { argb * line = (argb *) pixelscolor; uint8_t * grayline = (uint8_t *) pixelsgray; for (x=0;x<infocolor.width;x++) { grayline[x] = (255-0.3 * line[x].red) + (255-0.59 * line[x].green) + (255-0.11*line[x].blue)/3; } pixelscolor = (char *)pixelscolor + infocolor.stride; pixelsgray = (char *) pixelsgray + infogray.stride; } 

    Produzione ::

    immettere qui la descrizione dell'immagine

    EDIT 2 ::

    Ho fatto la semplice modifica all'image e mi restituisce l'image che volevo, ma l'image ha perso la sua luminosità.

    Questo è il cambiamento che ho fatto in function nativa ..

     for (y=0;y<infocolor.height;y++) { argb * line = (argb *) pixelscolor; uint8_t * grayline = (uint8_t *) pixelsgray; for (x=0;x<infocolor.width;x++) { grayline[x] = ((255-0.3 * line[x].red) + (255-0.59 * line[x].green) + (255-0.11*line[x].blue))/3; } pixelscolor = (char *)pixelscolor + infocolor.stride; pixelsgray = (char *) pixelsgray + infogray.stride; } 

    Risultato (l'image è scala di grigio ma perde la luminosità) ::

    immettere qui la descrizione dell'immagine

  • Styling EditText vista con forma disegnabile per sembrare simile al nuovo tema olografico per Android <3.0
  • l'invio di sms a più contatti tramite loop
  • Problemi che riconoscono le cifre in Tesseract - android
  • Debug di test di unità Jest con punti di interruzione nel codice VS con React Native
  • Come rallentare e allungare l'audio in Android?
  • Qual è il path del file system utilizzato dal Context.openFileOutput () di Android?
  • One Solution collect form web for “Applica l'effetto di scala di grigi a Image utilizzando NDK (C / C ++) in Android”

    Per get un'image in scala di grigi, each pixel dovrebbe avere la stessa quantità di rosso, verde e blu

    Forse utilizzare il componente rosso e influenzarlo sia verde che blu per il calcolo della grigia

    o usare la formula (R + G + B) / 3 = Grigio

    Le immagini negative vengono normalmente ottenute spostando each componente:

    NegR = 255 – grigio

    e così via

    Quindi potresti provare a calcolare il grigio [x] = (255 – 0.3 * line [x]) + …

    Modifica per luminosità: per get una migliore luminosità, cercare di aggiungere una quantità fissa al calcolo della scala di grigi:

     G += Bness; 

    Sembra che Bness dovrebbe essere negativo finché andrai da 255 (nero) a 0 (bianco) per qualche motivo strano. Volete mettere un limite giù per non andare sotto 0 per il vostro valore grascale, quindi provare:

     G = max(0, G+Bness); 

    Raccommand qualcosa come Bness = -25

    Modificare la luminosità dell'implementazione:

     // Declare a global variable for your brightness - outside your class static uint8_t bness = -25; // In your grayscale computation function for y... for x... grayscale[x] = ( (255-0.3*line[x].red) + ..... ) /3 ; int16_t gBright = grayscale[x] + bness; grayscale[x] = MAX( 0, gBright ); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.