2013-02-25 51 views
12

Tôi đang cố tạo một chương trình chỉnh sửa hình ảnh đơn giản trong java. Tôi đã tạo một đối tượng ImageCanvas có tất cả thông tin về hình ảnh đang được chỉnh sửa (một số thuộc tính cơ bản, danh sách các hiệu ứng đang được áp dụng, danh sách các lớp BufferedImage, v.v.) và tôi muốn một cách đơn giản để lưu nó vào đĩa có thể được mở lại sau.Cách sắp xếp một đối tượng bao gồm BufferedImages

Tôi nhận thấy rằng bằng cách sử dụng giao diện Serializable defualt của Java có thể chính xác những gì tôi đang tìm kiếm và tôi có thể viết toàn bộ đối tượng đó để đọc và đọc lại vào bộ nhớ sau. Tuy nhiên, ImageCanvas bao gồm ArrayList<BufferedImage>BufferedImage không thể tuần tự hóa được (mọi thứ khác).

Tôi biết nó có thể ghi đè lên các phương pháp writeObject()readObject(), nhưng tôi chưa bao giờ làm như vậy và tôi đã tự hỏi nếu có bất kỳ cách dễ dàng để có Java serialize mọi thứ khác và có một số cách tùy chỉnh để đọc/viết BufferedImage vào đĩa? Hoặc là có một số cách khác để dễ dàng viết toàn bộ đối tượng ImageCanvas vào đĩa mà tôi đang xem? Cuối cùng tôi có thể thực hiện loại tệp hình ảnh tùy chỉnh của riêng mình, nhưng ngay bây giờ tôi muốn một cách nhanh chóng và dễ dàng để lưu tệp tạm thời trong khi tôi đang thử nghiệm (lớp ImageCanvas sẽ thay đổi rất nhiều, vì vậy tôi không muốn tiếp tục cập nhật loại tệp tùy chỉnh của tôi trước khi tôi hoàn thành tệp).

Trả lời

23

làm cho ArrayList<BufferedImage> tạm thời của bạn và triển khai phương thức tùy chỉnh writeObject(). Trong trường hợp này, hãy ghi dữ liệu thông thường cho ImageCanvas của bạn, sau đó ghi dữ liệu byte cho hình ảnh theo cách thủ công, sử dụng định dạng PNG.

class ImageCanvas implements Serializable { 
    transient List<BufferedImage> images; 

    private void writeObject(ObjectOutputStream out) throws IOException { 
     out.defaultWriteObject(); 
     out.writeInt(images.size()); // how many images are serialized? 
     for (BufferedImage eachImage : images) { 
      ImageIO.write(eachImage, "png", out); // png is lossless 
     } 
    } 

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { 
     in.defaultReadObject(); 
     final int imageCount = in.readInt(); 
     images = new ArrayList<BufferedImage>(imageCount); 
     for (int i=0; i<imageCount; i++) { 
      images.add(ImageIO.read(in)); 
     } 
    } 
} 
+0

Tôi có thể sử dụng nó như thế nào. phương pháp là riêng tư. – avicennasoftwarelabs

+1

@avicennasoftwarelabs, Chỉ cần triển khai writeObject và readObject sẽ cho Java serialization sử dụng các phương thức đó khi serializing/deserializing đối tượng của bạn, mặc dù các phương thức là private. –

+2

Thật không may là bộ giải mã PNG trong ImageIO có lỗi trong đó, có nghĩa là dữ liệu bạn đọc lại không giống với dữ liệu bạn viết (màu sắc thường bị tắt bởi 1) – mjaggard

0

Việc tuần tự hóa khá đơn giản vì nó vẫn giữ được dữ liệu tĩnh. Bạn đang ở một nơi phù hợp với đối tượng đọc/ghi trong chuỗi gia đình của phương pháp. Hãy nghĩ về "BufferedImage" là gì. Đây là một triển khai phát trực tuyến được đệm. Để tuần tự hóa, dữ liệu phải được chuyển sang một đối tượng tĩnh như một mảng byte [] và sau đó đối tượng THAT có thể được tuần tự hóa/deserialized vào/ra khỏi BufferedImage sao cho luồng đệm bây giờ vào/ra khỏi byte đó [] mảng.

+0

Bạn có thể cung cấp một số mã để thực hiện điều này trong trường hợp của tôi hay không? – scaevity

+0

Làm theo các phương pháp trên BufferedImage (nếu bạn phải sử dụng lớp này) liên quan đến các nhà xây dựng. Từ đây một WritableRaster (và các dữ liệu khác) có thể được sử dụng để tạo ra một BufferedImage. BufferedImage có phương thức getWritableTile (x, y) trả về một WritableRaster. Lớp Raster, mà WritableRaster được thừa hưởng từ, có các phương thức getPixel() khác nhau có thể trả về, ví dụ, một mảng int nguyên thủy []. Nó không phải là khủng khiếp đơn giản nhưng có thể được đảo ngược để có được từ các nguyên thủy trở lại BufferedImage. Ngoài ra, hãy xem xét sử dụng một lớp hình ảnh cơ sở khác nhau dễ dàng hơn để tuần tự hóa/deserialize. –

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