2011-12-28 42 views
11

Tôi có các phim tiêu cực cũ mà tôi đã quét trên máy tính của mình. Tôi muốn viết một chương trình nhỏ để chuyển đổi các hình ảnh tiêu cực về trạng thái tích cực của nó.Chuyển đổi hình ảnh âm thành dương

Tôi biết có một số ứng dụng chỉnh sửa hình ảnh mà tôi có thể sử dụng để đạt được chuyển đổi này, nhưng tôi đang nghiên cứu cách thao tác các pixel để tự chuyển đổi chúng thông qua một ứng dụng nhỏ.

Có ai có thể cho tôi khởi đầu về điều này không? Mã mẫu nếu có thể cũng sẽ được đánh giá cao.

+2

* "Có ai có thể cho tôi một khởi đầu về điều này không?" * Bạn đã làm gì cho đến nay? [Bạn đã thử gì?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) Hãy xem qua JavaDocs cho ['BufferedImage'] (http: // docs. oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html) và xem liệu bạn có thể tìm ra nơi bắt đầu hay không. –

Trả lời

27

Tôi vừa viết một ví dụ làm việc. Cho hình ảnh đầu vào sau đây img.png.

img.png

Kết quả sẽ là một hình ảnh mới invert-img.png như

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

Nếu bạn muốn tạo một hình ảnh đơn sắc, bạn có thể làm thay đổi tính col một cái gì đó như thế này :

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

trên sẽ cung cấp cho bạn những hình ảnh sau đây

monochromic-img.png

Bạn có thể điều chỉnh MONO_THRESHOLD để có được một kết quả làm hài lòng hơn. Tăng số lượng sẽ làm cho pixel tối hơn và ngược lại.

+0

Điều này thật tuyệt vời. Có cách nào để làm cho hình ảnh nhị phân (hai màu/đen và trắng), tốt nhất là sử dụng mã tương tự? – MusTheDataGuy

+0

Bạn có nghĩa là thang màu xám không? Có, bạn chỉ có thể chỉnh sửa phần 'màu mới (...)'. Tôi đề nghị bạn đặt tất cả các giá trị thành '(col.getRed() + col.getGreen() + col.getBlue())/3'. – kba

+0

Cảm ơn câu trả lời của bạn. Greyscale không phải là những gì tôi đang tìm kiếm - tôi đang tìm kiếm để có thể chuyển đổi một hình ảnh thành màu đen và trắng (còn gọi là một hình ảnh nhị phân/1-bit). Hình ảnh kết quả sẽ xuất hiện dưới dạng nền trắng với các thành phần màu đen khi nó thiếu chi tiết nhất. Bất kỳ ý tưởng về làm thế nào để đạt được điều này? Tôi không nghĩ rằng RGB đi vào nó vì nó không đối phó với R, G hoặc B. Cảm ơn bạn. – MusTheDataGuy

2

Sau đó, khởi động đầu. Giả sử rằng bạn có quyền truy cập vào mỗi điểm ảnh cá nhân trong hình ảnh tiêu cực, và rằng mỗi pixel có các thành phần RGB, có được các thành phần RGB của các điểm ảnh ban đầu như thế này:

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 

Làm trên cho từng pixel, bạn có thể lấy hình ảnh gốc bằng cách tạo lại pixel theo pixel.

+4

abs là không cần thiết. Chỉ cần làm '(0xFF - pixel.getRed()) ' – Pubby

+0

đó là một cách khác để làm điều đó, nhưng tôi đang cố gắng giữ cho mọi thứ đơn giản để hiểu được –

+0

@Oscar: Làm thế nào để thêm sự phức tạp không cần thiết" giữ nó đơn giản "? –

4

Hãy thử LookupOp. Dưới đây là một số sample từ sách Khách hàng giàu có của Filthy.

Các vấn đề liên quan