2015-08-19 10 views
7

Czytałem narzędzia programistyczne Java X OS X, aby moja aplikacja była bardziej "natywna" w systemie operacyjnym. Znalazłem coś interesującego w tym konkretnym section. (Kopalnia nacisk)W jaki sposób Java ładuje natywne oprogramowanie NSImages?

Aby załadować niezależne od rozdzielczości TIFF, icns, lub pdf plik z folderu Resources swojego pakietu aplikacji do aplikacji Java, należy użyć metody java.awt.ToolkitgetImage(). Ciąg znaków, który przekazujesz do getImage(), ma postać "NSImage://MyImage". Nie dołączaj rozszerzenia pliku obrazu. Należy także pamiętać, że renderer Sun 2D jest wyłączony, gdy współczynnik skali interfejsu użytkownika nie ma wartości 1,0. Użyj renderera Quartz, aby obrazy były skalowane płynnie.

Znany z javax.imageio, jest to kompletne zaskoczenie, ponieważ nie znałem żadnego innego sposobu na załadowanie innych typów plików do obrazów. Zwłaszcza z przestarzałą platformą i absolutnie bez wsparcia dla plików takich jak .tiff. Na przykład, szybkie testy na moim komputerze daje mi to:

Supported read formats: [jpg, bmp, gif, png, wbmp, jpeg] 
Supported write formats: [jpg, bmp, gif, png, wbmp, jpeg] 
'JPEG' reader: [email protected] 
'JPEG' reader: [email protected] 

Próbowałem ładowania prosty .tiff obraz i przetestowane na to uwagę:

 
static Image n; 

public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    JPanel p = new JPanel() { 
     @Override 
     public void paintComponent(Graphics graphics) { 
      graphics.drawImage(n, 0, 0, null); 
     } 
    } 
    f.add(p); 
    n = Toolkit.getDefaultToolkit().getImage(("/Users/zinedine/Desktop/test_image.tiff"); 
    f.setVisible(true) 
} 

To daje nic:

enter image description here

Próbowałem ponownie: tym razem, dodając obraz do folderu podstawowego mojego projektu java, i wpisałem to jako ciąg znaków: "NSImage://test_image.tiff". Jak wszystko, co robię, to nie działa.

Jednak Jeśli zmienię mojego fantazyjny ciąg ścieżki do NSImage jednym, takich jak "NSImage://NSApplicationIcon" ...

enter image description here

To działa. Zrobiłem szybkie wyszukiwanie w centrum uwagi NSImage i znalazłem je. Wygląda na to, że typ pliku dla tych obrazów to .png. Jest to niepokojące, ponieważ spodziewałem się, że powstanie z niego właściwy obraz. Pamiętaj, ja też się tego spodziewałem: jeśli oczekuje argumentów w postaci "NSImage://something", to może po prostu zignorować cokolwiek innego.

Oczywiście, mam kilka pytań:

  • jaki sposób Toolkit załadować zdjęcie? Gdy próbuję załadować .tiff obraz z mojego komputera, to co mam, jeśli zadzwonię .toString():

    [email protected] // Also can't be cast to java.awt.BufferedImage 
    
  • Czy czytelnicy i pisarze (jeśli w ogóle) część publicznego API? Innymi słowy, można wywołać coś załadować mój plik .tiff się na Image (który można następnie wrzucony do `BufferedImage?

  • a następnie ponownie, jeśli czytelników/pisarzy są częścią API, dlaczego nie robi” t zlokalizować je w pakiecie javax.imageio?

To może wyglądać jak garść, (tak mi przykro za zrujnowanie swój dzień na to pytanie), ale dla mnie to wygląda jak oczekiwano, ale w tym samym czasie błędnego zachowania. Znaki premiowe: Czy istnieje przyjazny (tj. Open Source) obrazowy api (nie JAI), który może przetwarzać pliki .tiff (i inne)?

Odpowiedz

1

Zadajesz tutaj wiele pytań, ale zrobię co w mojej mocy, aby wszystko zinterpretować. :-)

Używanie Toolkit do ładowania obrazów (java.awt.Image i przyjaciół) jest częścią "starego" asynchronicznego interfejsu API do tworzenia obrazu/konsumenta i może wydawać się nieco kłopotliwe w pracy. Ładowanie ładowanych ikon i podobnych jest całkowicie w porządku, ale mniej nadaje się do ładowania dużych obrazów dostarczanych przez użytkownika, ponieważ nie masz śledzenia postępów, informacji o błędach, jeśli coś pójdzie nie tak, itp.

Obrazy te są również o wiele mniej użyteczne niż BufferedImage s, jeśli chcesz wykonywać wszelkiego rodzaju operacje na obrazie. Nie można przesyłać ich do wersji BufferedImage, ale można je "przekonwertować", zamalowując je na BufferedImage.

Klasa Toolkit jest abstrakcyjna, a otrzymasz konkretną instancję za pomocą Toolkit.getToolkit(). Ta konkretna instancja jest specyficzna dla platformy i kończy się przy użyciu specyficznych dla systemu wywołań natywnych dla większości metod, takich jak ładowanie obrazów.

Implementacja Apple Java ma kilka dodatkowych funkcji, takich jak umożliwienie ładowania obrazów systemu Apple za pomocą specjalnego schematu URI. Wygląda na to, że w ten sposób można również załadować dołączone obrazy, stosując konwencję nazewnictwa @2x, a nawet wielkoskalowe pliki TIFF lub skalowalne pliki PDF w systemie OS X w celu uzyskania niezależnej od rozdzielczości grafiki dla aplikacji.

Należy pamiętać, że aby to działało, należy spakować aplikację jako pakiet aplikacji i umieścić swoje obrazy w folderze Zasoby (tj. Contents/Resources) pakietu. I musisz odnosić się do obrazów, używając nazwy bazowej, bez rozszerzenia. Nie można użyć tej funkcji do odczytywania losowych plików TIFF nieopakowanych w aplikację (tj. Treści dostarczanych przez użytkownika), o ile wiem.

Ponadto funkcja ta jest specyficzne dla Apple JRE i będzie działać tylko na Apple własnym JRE, a na OS X. Nie jest częścią publicznych API Javy, a to nie będzie działać wieloplatformowym. Zaleca się oszczędne korzystanie z funkcji i tylko lepszą integrację systemu (np. Sprawić, aby aplikacja wyglądała bardziej naturalnie) na OS X.

Aby odczytać (i zapisać) dowolny TIFF (lub inny format dla tego dobra) , powinieneś zamiast tego użyć ImageIO i odpowiednich wtyczek. Środowisko JRE nie ma wtyczek do formatu TIFF z jakiegoś powodu, ale istnieje kilka wtyczek innych firm.

Jeśli nie chcesz używać JAI (przez jai_imageio.jar), mogę polecić mój własny TwelveMonkeys library which supports TIFF wraz z kilkoma innymi formatami. Korzysta z przyjaznej dla biznesu licencji open source BSD.

Dostępne są również Apache Commons Imaging, iCafe i prawdopodobnie inne, które potrafią czytać/zapisywać pliki TIFF, ale mają one własne niestandardowe interfejsy API, dzięki czemu są mniej elastyczne i bardziej zastrzeżone.

+0

Co? Mistrz! Wróciłeś !! – Zizouz212

Powiązane problemy