2011-12-28 13 views
11

में कनवर्ट करें मेरे पास पुरानी नकारात्मक फिल्में हैं जिन्हें मैंने अपने कंप्यूटर पर स्कैन किया है। मैं नकारात्मक छवियों को अपने सकारात्मक स्थिति में बदलने के लिए एक छोटा प्रोग्राम लिखना चाहता हूं।नकारात्मक छवि को सकारात्मक

मुझे पता है कि वहां कई छवि संपादक अनुप्रयोग हैं जिन्हें मैं इस रूपांतरण को प्राप्त करने के लिए उपयोग कर सकता हूं, लेकिन मैं शोध कर रहा हूं कि पिक्सेल को एक छोटे से ऐप के माध्यम से स्वयं कैसे परिवर्तित करें।

क्या कोई मुझे इस पर एक प्रमुख शुरुआत दे सकता है? यदि संभव हो तो नमूना कोड भी बहुत सराहना की जाएगी।

+2

* "क्या कोई मुझे इस पर एक प्रमुख शुरुआत दे सकता है?" * अब तक आपको क्या मिला है? [आपने क्या प्रयास किया है?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) ['BufferedImage'] के लिए JavaDocs पर एक नज़र डालें (http: // docs। oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html) और देखें कि क्या आप यह पता लगा सकते हैं कि कहां से शुरू करना है। –

उत्तर

27

मैंने अभी एक कामकाजी उदाहरण लिखा है। निम्नलिखित इनपुट छवि img.png को देखते हुए।

img.png

उत्पादन एक नई छवि invert-img.png

तरह

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(); 
     } 
    } 
} 

आप एक मोनोक्रोम छवि बनाने के लिए चाहते हैं, आप कुछ इस तरह के col की गणना कर सकते हैं बदल हो जाएगा :

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); 

ऊपर आपको निम्न चित्र

monochromic-img.png

आप MONO_THRESHOLD समायोजित कर सकते हैं एक और अधिक आकर्षक उत्पादन प्राप्त करने के लिए दे देंगे। संख्या बढ़ाना पिक्सेल को गहरा कर देगा और इसके विपरीत।

+0

यह अद्भुत है। क्या छवियों को बाइनरी (दो रंग/काला और सफेद) बनाने का कोई तरीका है, अधिमानतः समान कोड का उपयोग करना? – MusTheDataGuy

+0

क्या आपका मतलब ग्रे स्केल है? हां, आप बस 'नया रंग (...)' भाग संपादित कर सकते हैं। मेरा सुझाव है कि आप सभी मानों को '(col.getRed() + col.getGreen() + col.getBlue())/3' पर सेट करें। – kba

+0

आपके उत्तर के लिए धन्यवाद। Greyscale वह नहीं है जो मैं खोज रहा था - मैं एक छवि को सिर्फ काले और सफेद (उर्फ एक बाइनरी/1-बिट छवि) में परिवर्तित करने में सक्षम होना चाहता हूं। परिणामस्वरूप छवि उस पर काले तत्वों के साथ एक सफेद पृष्ठभूमि के रूप में दिखाई देनी चाहिए जिसमें अधिकतर जानकारी नहीं है। इसे कैसे प्राप्त किया जाए इस पर कोई विचार? मुझे नहीं लगता कि आरजीबी इसमें आता है क्योंकि यह आर, जी या बी से निपटता नहीं है। धन्यवाद। – MusTheDataGuy

2

तब एक सिर शुरू होता है। यह मानते हुए कि आप नकारात्मक छवि में प्रत्येक व्यक्ति पिक्सेल के लिए उपयोग किया है, और प्रत्येक पिक्सेल घटक आरजीबी है, इस तरह मूल पिक्सल के आरजीबी घटक प्राप्त:

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 

प्रत्येक पिक्सेल के लिए ऊपर कर, आप प्राप्त कर सकते हैं इसे पिक्सेल-बाय-पिक्सेल को दोबारा बनाकर मूल छवि।

+4

abs अनावश्यक है। बस करें (0xFF - पिक्सेल।getRed()) ' – Pubby

+0

यह करने का एक और तरीका है, लेकिन मैं –

+0

@ ऑस्कर को समझने के लिए चीजों को सरल रखने की कोशिश कर रहा हूं: अनावश्यक जटिलता को" सरल रखना "कैसे जोड़ रहा है? –

4

LookupOp आज़माएं। गंदी रिच क्लाइंट्स पुस्तक से sample यहां है।

संबंधित मुद्दे