2011-12-28 17 views
11

Ho vecchi film negativi che ho scansionato sul mio computer. Voglio scrivere un piccolo programma per convertire le immagini negative al suo stato positivo.Converti immagine negativa in positivo

So che ci sono diverse applicazioni di editor di immagini là fuori che posso utilizzare per ottenere questa conversione, ma sto facendo ricerche su come manipolare i pixel per convertirli da me tramite una piccola app.

Qualcuno può darmi un vantaggio su questo? Anche il codice di esempio, se possibile, sarà molto apprezzato.

+2

* "Qualcuno può darmi un vantaggio su questo?" * Che cos'hai ottenuto finora? [Cosa hai provato?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) Dai un'occhiata a JavaDocs per ['BufferedImage'] (http: // docs. oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html) e vedi se riesci a capire da dove iniziare. –

risposta

27

Ho appena scritto un esempio funzionante. Data la seguente immagine di input img.png.

img.png

L'uscita sarà una nuova immagine invert-img.png come

invert-img.png

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 

class Convert 
{ 
    public static void main(String[] args) 
    { 
     invertImage("img.png"); 
    } 

    public static void invertImage(String imageName) { 
     BufferedImage inputFile = null; 
     try { 
      inputFile = ImageIO.read(new File(imageName)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     for (int x = 0; x < inputFile.getWidth(); x++) { 
      for (int y = 0; y < inputFile.getHeight(); y++) { 
       int rgba = inputFile.getRGB(x, y); 
       Color col = new Color(rgba, true); 
       col = new Color(255 - col.getRed(), 
           255 - col.getGreen(), 
           255 - col.getBlue()); 
       inputFile.setRGB(x, y, col.getRGB()); 
      } 
     } 

     try { 
      File outputFile = new File("invert-"+imageName); 
      ImageIO.write(inputFile, "png", outputFile); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Se si desidera creare un'immagine monocromatica, è possibile modificare il calcolo del col a qualcosa di simile :

int MONO_THRESHOLD = 368; 
if (col.getRed() + col.getGreen() + col.getBlue() > MONO_THRESHOLD) 
    col = new Color(255, 255, 255); 
else 
    col = new Color(0, 0, 0); 

Quanto sopra vi darà la seguente immagine

monochromic-img.png

È possibile regolare MONO_THRESHOLD per ottenere un output più gradevole. Aumentando il numero si renderà il pixel più scuro e viceversa.

+0

Questo è meraviglioso. C'è un modo per rendere le immagini binarie (due colori/bianco e nero), preferibilmente usando un codice simile? – MusTheDataGuy

+0

Intendi dire scala di grigi? Sì, puoi semplicemente modificare la parte 'nuova Colore (...)'. Ti suggerisco di impostare tutti i valori su '(col.getRed() + col.getGreen() + col.getBlue())/3'. – kba

+0

Grazie per la risposta. La scala di grigi non è ciò che stavo cercando: sto cercando di convertire un'immagine in bianco e nero (ovvero un'immagine binaria/1 bit). L'immagine risultante dovrebbe apparire come uno sfondo bianco con elementi neri su di esso che sono privi di dettagli. Qualche idea su come raggiungere questo obiettivo? Non penso che l'RGB entri in gioco perché non si occupa di R, G o B. Grazie. – MusTheDataGuy

2

Un inizio di testa è, quindi. Supponendo che si ha accesso a ogni singolo pixel dell'immagine negativa, e che ogni pixel ha componenti RGB, ottenere i componenti RGB dei pixel originali come questo:

int originalRed = Math.abs(pixel.getRed() - 255); 
int originalGreen = Math.abs(pixel.getGreen() - 255); 
int originalBlue = Math.abs(pixel.getBlue() - 255); 
// now build the original pixel using the RGB components 

fare quanto sopra per ogni pixel, è possibile ottenere l'immagine originale ricreando pixel per pixel.

+4

abs non è necessario. Basta fare '(0xFF - pixel.getRed()) ' – Pubby

+0

questo è un altro modo per farlo, ma sto cercando di mantenere le cose semplici da capire –

+0

@Oscar: In che modo aggiungere complessità non necessaria" mantenendolo semplice "? –

Problemi correlati