2011-12-28 19 views
11

Bilgisayarımda taranan eski negatif filmler var. Negatif görüntüleri pozitif durumuna dönüştürmek için küçük bir program yazmak istiyorum.Ekspres resme pozitif dönüştürme

Bu dönüştürmeyi gerçekleştirmek için kullanabileceğim birkaç görüntü düzenleme uygulaması olduğunu biliyorum, ancak pikselleri kendim küçük bir uygulama aracılığıyla dönüştürmek için nasıl kullanacağım konusunda araştırma yapıyorum.

Bu konuda bana bir başlangıç ​​yapabilir mi? Mümkünse örnek kod da çok takdir edilecektir.

+2

* "Bana bu konuda bir başlangıç ​​yapabilir mi?" * Şimdiye kadar neler yaptınız? [Ne denediniz?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) ['BufferedImage'] için JavaDocs'a bir göz atın (http: // docs. oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html) ve nereden başlayacağınızı anlayabilecek misiniz? –

cevap

27

Sadece bir çalışma örneği yazdım. Aşağıdaki giriş resmi img.png verilir.

img.png

çıktı yeni bir resim 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(); 
     } 
    } 
} 

gibi tek renkli bir görüntü oluşturmak istiyorsanız, böyle bir şey için col hesaplamasını değiştirebilir olacak :

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); 
Bir daha hoş çıktı almak için MONO_THRESHOLD ayarlayabilirsiniz

monochromic-img.png

aşağıdaki imajını verecektir

yukarıda. Numarayı artırmak pikselin daha koyu olmasını sağlar ve tersini yapar.

+0

Bu harika. Görüntüleri benzer kod kullanarak, ikili (iki renk/siyah ve beyaz) yapmak için herhangi bir yolu var mı? – MusTheDataGuy

+0

Gri ​​skalayı mı kastediyorsun? Evet, 'yeni Renk (...)' bölümünü düzenleyebilirsiniz. Tüm değerleri '(col.getRed() + col.getGreen() + col.getBlue())/3' olarak ayarlamanızı öneririm. – kba

+0

Cevabınız için teşekkür ederiz. Gri tonlama ben aradığım şey değil - Ben sadece siyah ve beyaz (aka bir ikili/1-bit görüntü) içine bir görüntü dönüştürebilmek için arıyorum. Ortaya çıkan görüntü, üzerinde en fazla ayrıntıya sahip olmayan siyah elemanlarla beyaz bir arka plan olarak görünmelidir. Bunu nasıl başaracağınıza dair herhangi bir fikir var mı? R, G veya B ile ilgilenmediği için RGB'nin buna dahil olduğunu düşünmüyorum. Teşekkür ederim. – MusTheDataGuy

2

Bir başlangıç ​​başlangıcı, o zaman. Eğer negatif görüntüdeki her piksel erişebilir ve her piksel bileşenleri RGB sahip olduğunu, RGB böyle orijinal piksel bileşenlerini elde varsayarsak: Her piksel için yukarıdaki Doing

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 

, sen alabilirsiniz Orijinal görüntüyü piksel-piksel olarak yeniden oluşturarak.

+4

abs gereksizdir. Sadece yap (0xFF - piksel.getRed()) ' – Pubby

+0

bunu yapmanın başka bir yoludur, ancak işleri basit bir şekilde anlamaya çalışıyorum –

+0

@Oscar: Gereksiz karmaşıklık ekleyerek" basit tutmak "nasıl? –