Dlaczego ImageIO Java spłaszcza kolory JPEG

głosy
10

Kiedy czytam niektóre pliki JPG, kolory są spłaszczone. Oto prosty przykład, który czyta jpg i po prostu zapisuje ten sam obraz do innego pliku.

import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class JPegReadTest {
    public static void main(String[] args) {
        if (args.length == 2) {
            try {
                BufferedImage src = ImageIO.read(new File(args[0]));
                ImageIO.write(src, jpg, new File(args[1]));
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            System.err.println(Usage: java JPegReadTest src dest);
        }
    }
}

Jeśli spróbujesz to się na przykład http://www.flickr.com/photos/visualpanic/233508614/sizes/l/ , kolory obrazu docelowego różnią się od pliku źródłowego. Dlaczego? Jak to naprawić?

Próbowałem też zapisując obraz jako png, ale kolory są mdłe w nim też (tak zakładając informacji koloru nie jest prawidłowo odczytać).

Utwórz 13/08/2009 o 13:32
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
10

To może być kilka powodów.

  1. JPEG dane kolor jest często zapisywany jako YCrCb zamiast RGB, chociaż konwersje powinny być głównie niezauważalne.
  2. JPEG często ma wbudowany profil kolorów, ale wiele aplikacji nie rozumieją tego i po prostu zignorować (w tym przypadku, plik wyjściowy może być brakuje profilu kolorów).
  3. wartość gamma może być zresetowany lub brakuje go po Java Zmieniany.

I faktycznie nie spróbować przykład ... mógłbyś dodawać zarówno przed, jak i po plików? Bez faktycznie jest w stanie zbadać pliku wynikowego, to trudno powiedzieć, czy ta dodatkowa dane czy nie.

Edit: Tak, to jest oczywiste, że oryginalne i przeliczone obrazy mają różne profile kolorów. Java okorowane oryginału profil kolorów sRGB i używane zamiast rodzajowe. Wyglądają tak samo do nas na Windows z Firefoksem i różnorodnych programów, ponieważ te programy nie korzystają z profilu kolorów podczas renderowania. Jednak na komputerze Mac, Mac faktycznie obsługuje następujące profile kolorów (debata cue na Mac dla grafiki, itd.), A więc uczynić inaczej. Nie mam Mac poręczny, ale podejrzewam, że jeśli otworzyć pliki w programie Photoshop na dowolnej platformie, zobaczysz różnicę.

Odpowiedział 13/08/2009 o 13:44
źródło użytkownik

głosy
0

JPEG jest stratna Format. Kiedy czytać, sklepy java go jako surowego formatu znacznie niczym BMP. Wtedy to jest napisane na nowo, powodując utratę danych. Ponadto, nie ma zbyt wiele kontroli nad jakością, tak jak przy użyciu coś jak GIMP.

Może wyglądać na użyciu innych API jak ImageMagick , aby dać Ci większą kontrolę nad jakością.

Odpowiedział 13/08/2009 o 13:45
źródło użytkownik

głosy
0

JPEG jest stratna Format.

Oznacza to, że jeśli użytkownik otworzy plik i zapisać go ponownie straci trochę informacji chyba, że ​​bardzo konkretne kroki, aby nie stracić każdy (w tym przypadku możliwe manipulacje są bardzo ograniczone).

Dodatkowo ImageIO.write()prawdopodobnie używa niektóre ustawienia domyślne jakości do zapisywania plików w formacie JPEG, które mogą być niższe niż w oryginale, który doprowadziłby do dodatkowej utraty jakości.

Spróbuj zapisać do pliku PNG, a zobaczysz, że będzie wyglądać tak samo jak źródła.

Odpowiedział 13/08/2009 o 13:47
źródło użytkownik

głosy
2

Być może źródło obrazu ma przypisany profil kolorów z gamy szerszej niż sRGB (jak Adobe RGB), a swoim obciążeniem / zapisać cykl nie zachowując informacji przestrzeni kolorów? Bez profilu kolorów, Twoja przeglądarka przyjmie sRGB, a sprężone gama uczyni wszystko wyglądać „bla”. Jeśli masz exiftool,

exiftool -ProfileDescription filename.jpg

Jest to szybki sposób zweryfikować profile kolorów na zdjęciach źródłowych i wyjściowych.

Odpowiedział 13/08/2009 o 15:15
źródło użytkownik

głosy
0

Tu jest link z kodem źródłowym, który rozszerza się na interfejsie ImageIO - można zmieniać parametry jakościowe i kompresji przy zapisie obrazu .... http://www.universalwebservices.net/web-programming-resources/java/adjust- JPEG kompresja obrazu jakości, gdy oszczędzający-obrazy-in-java

Odpowiedział 18/01/2013 o 01:29
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more