2017-12-29 163 views
6

Tôi đã chuyển đổi hình ảnh thành một mảng pixel. Tôi đã lưu các giá trị RGB trong ba mảng riêng biệt.Chuyển đổi hình ảnh thành mảng pixel, tạo lại hình ảnh bằng pixel - kích thước bị giảm. Tại sao?

Sau đó, tôi đã thử tạo hình ảnh bằng các giá trị giống nhau (không có thao tác). Ảnh gốc có kích thước 205kB và hình ảnh mới là 121kB trong trường hợp ảnh B & W và từ 215kB đến 96kB trong trường hợp có hình ảnh màu. Ngoài ra, có sự thay đổi nhỏ về độ sáng (độ sáng được tăng lên và độ tương phản tổng thể). Điều gì gây ra điều này?

Tôi đã thử cả hai ảnh có màu và B & W. Kết quả giống nhau.

Ngoài ra, tôi chạy cùng mã trên hình ảnh đầu ra trước đó (96kB), đầu ra mới vẫn là 96kB.

Codes-


1) Để đọc hình ảnh:

int width = img.getWidth(null); 
int height = img.getHeight(null); 

pixelR = new int[width * height]; 
pixelG = new int[width * height]; 
pixelB = new int[width * height]; 

int index=0; 

int r, g, b, gray, rgb; 

for(int i=0; i<width; i++) { 
    for (int j=0; j<height; j++) { 
    rgb = img.getRGB(i, j); 

    r = (rgb >> 16) & 0xFF; 
    g = (rgb >> 8) & 0xFF; 
    b = (rgb & 0xFF); 

    pixelR[index]=r; 
    pixelG[index]=g; 
    pixelB[index]=b; 
    index++; 
    } 
} 

2) Viết image:

 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

    int index=0; 
    int val; 
    int r, g, b; 

    for (int i=0; i<width; i++) { 
    for (int j=0; j<height; j++) { 

     r=pixelR[index]; 
     g=pixelG[index]; 
     b=pixelB[index++]; 

     Color newColor = new Color((int)r, (int)g, (int)b);  
     image.setRGB(i, j, newColor.getRGB()); 
    } 
    } 

    File f = null; 

    try{ 
    f = new File("<filepath>.jpg"); 
     ImageIO.write(image, "jpg", f); 
    }catch(IOException e){ 
     System.out.println("Error: "+e); 
    } 
    } 
+3

Có lẽ bạn đang viết với chất lượng thấp hơn hình ảnh gốc? –

+1

'pixelR [index] = r; pixelG [index] = r; pixelB [index] = r; 'bạn đang gán cùng một giá trị lặp lại. Nó là một lỗi đánh máy? – TDG

+0

@TDG có, lỗi đánh máy. Đã sửa. –

Trả lời

1

Bạn có thể thử đặt mức nén thành các giá trị khác nhau và xem kích thước tệp khác nhau tùy theo điều đó như thế nào. Xem Setting jpg compression level with ImageIO in Java để biết cách thực hiện điều đó.

Mặc dù vậy, không giải thích được sự thay đổi về độ sáng và độ tương phản.

+0

Nếu trường hợp đó xảy ra, hình ảnh đầu ra sẽ không được nén lại nếu tôi cung cấp hình ảnh đầu ra làm hình ảnh đầu vào? Ví dụ: hình ảnh, ** image1 ** là 100kB, được nén thành 60kB khi tôi chạy chương trình trên đó và được lưu dưới dạng ** output1 **, bây giờ hình ảnh 60kB đó sẽ bị nén lại nếu tôi chạy chương trình trên và lưu nó dưới dạng ** output2 **, không phải như vậy và ** output2 ** cũng là 60kB. –

+0

Không, bạn thường không thể nén nhiều lần với các hiệu ứng tích cực (giảm kích thước). Nếu đó là trường hợp, bạn có thể nén nhiều lần trong một hàng và đưa ra một tập tin chỉ nói một byte. Tệp kết quả sẽ không thể mã hóa hình ảnh với chất lượng tương tự. Nén dựa vào việc phát hiện các mẫu dữ liệu và mã hóa chúng một cách hiệu quả. Với nhiều thuật toán phổ biến, không thể phát hiện các mẫu tiết kiệm không gian khi chạy lần thứ hai trên dữ liệu đã nén. – sebkur

+0

Xem câu hỏi này trên một cuộc thảo luận chung về việc nén dữ liệu nhiều lần: https://stackoverflow.com/questions/3198666/why-can-data-be-compressed-only-once – sebkur

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