2015-09-05 19 views
5

Klasa Java BufferedImage ma długą listę zmiennych klasowych znanych jako typ obrazu, które mogą być używane jako argument dla konstruktora BufferedImage.Jak wybrać typ obrazu BufferedImage do użycia?

Jednak w dokumentach Java wyjaśniono minimalnie, do czego służą te typy obrazów i jak wpłynie to na tworzony obraz BufferedImage.

Moje pytanie brzmi:

  1. Jak typ obrazu wpływa na BufferedImage być tworzone? Czy kontroluje liczbę bitów używanych do przechowywania różnych kolorów (czerwony, zielony, niebieski) i jego przezroczystości?

  2. Który typ obrazu należy użyć, jeśli chcemy tylko, aby utworzyć

    • obraz nieprzejrzysty
    • przezroczysty obraz
    • półprzezroczysty obraz

Przeczytałem opis w Dokumencie Java wiele razy, ale nie mogłem pojąć, jak powinniśmy go używać. Na przykład ten:

TYPE_INT_BGR

Reprezentuje obraz z 8-bitowych składowych koloru RGB, co odpowiada Windows- lub Solaris- stylu BGR modelu kolorów z kolorami niebieski, zielony, i Red pakowane w piksele całkowite. Nie ma alfa. Obraz ma DirectColorModel. Gdy dane z nieprzeźroczystą alfą są przechowywane na obrazie tego typu, dane kolorów muszą zostać dostosowane do postaci niezmienionej, a alfa odrzucona, jak opisano w dokumentacji AlphaComposite.

+0

Co to jest półprzezroczysty obraz? Czym różni się od przezroczystego obrazu? –

+0

@AndyTurner Pamiętam, że czytałem gdzieś o tym, że części obrazu są przezroczyste, a półprzezroczyste reguluje krycie całego obrazu. Na przykład plik gif pozwala na przezroczystość, ale nie przezierność, podczas gdy pliki png obsługują oba. Jest to przykład, w którym konieczne może być użycie innego typu obrazu. Nie? – user3437460

Odpowiedz

6

Chyba że masz specyficzne wymagania (na przykład oszczędność pamięci lub zapisywania obliczeń lub konkretną natywnego formatu pikseli) po prostu iść z domyślnym TYPE_INT_ARGB który ma 8 bitów na kanał, 3 kanały + alfa.

Pomijanie kanału alfa podczas pracy z 8 bitami na kanał nie wpłynie na całkowitą pamięć zajmowaną przez obraz, ponieważ każdy piksel będzie w każdym przypadku zapakowany w numer int, aby 8 bitów zostało odrzuconych.

Zasadniczo masz:

  • TYPE_INT_ARGB, 4 bajty na piksel z kanałem alfa
  • TYPE_INT_ARGB_PRE, 4 bajty na piksel, tak samo jak wcześniej, ale kolory są już pomnożone przez alfa piksela uratować obliczeń
  • TYPE_INT_RGB, 4 bajty na piksel bez kanału alfa
  • TYPE_USHORT_555_RGB i TYPE_USHORT_565_RGB, 2 bajty na piksel, znacznie mniej kolorów, nie trzeba go używać unl - masz ograniczenia pamięci:

Następnie są formaty tego samego rodzaju z zamienionymi kanałami (np. BGR zamiast tego RGB). Powinieneś wybrać ten, który jest natywny dla twojej platformy, tak aby mniej było konwersji.

+0

dzięki za szybką odpowiedź. Więc mogę po prostu użyć 'TYPE_InT_ARGB' dla nieprzezroczystego, przezroczystego i półprzezroczystego obrazu, chyba że mam jakieś inne specjalne potrzeby, takie jak wspomniane przez ciebie? – user3437460

+0

Tak, półprzezroczysty obraz nie jest półprzezroczysty per se (chyba że wszystkie piksele mają alfa). Możesz uzyskać półprzezroczystość, rysując obraz z mieszaniem alfa w docelowym buforze ramki. – Jack

+0

I tak długo, gdy typ obrazu ma wsparcie dla kanału alfa, będzie w stanie obsługiwać przezroczystość, czy mogę to powiedzieć? To jest moje ostatnie pytanie! :RE – user3437460