Soru Java BufferedImage kırmızı, yeşil ve maviyi ayrı ayrı alıyor


GetRGB yöntemi tek bir int döndürür. Kırmızı, yeşil ve mavi renkleri tek tek 0 ve 255 arasındaki değerler olarak nasıl alabilirim?


47
2018-04-11 00:02


Menşei




Cevaplar:


Java'nın Renk sınıf dönüşüm yapabilir:

Color c = new Color(image.getRGB());
int red = c.getRed();
int green = c.getGreen();
int blue = c.getBlue();

70
2018-04-11 00:05



Yeni oluşturuluyor Color bir görüntünün her pikselinin örneği çok fazla çöp üretir ve çok yetersiz. Bir görüntünün her pikselini işlemeyi planlıyorsanız, her pikselin RGB rengini elde etmek çok daha verimlidir. bufferedImage.getRGB(x,y)ve kırmızı, yeşil ve mavi bileşenleri, João Silva'nın cevabında açıklandığı gibi çıkarın. - Marco13


Bir piksel 4 bayt (32 bit) tamsayı ile temsil edilir;

00000000 00000000 00000000 11111111
^ Alpha  ^Red     ^Green   ^Blue

Bu yüzden, bireysel renk bileşenlerini elde etmek için, sadece biraz ikili aritmetik gerekir:

int rgb = getRGB(...);
int red = (rgb >> 16) & 0x000000FF;
int green = (rgb >>8 ) & 0x000000FF;
int blue = (rgb) & 0x000000FF;

Bu gerçekten ne java.awt.Color sınıf yöntemleri:

  553       /**
  554        * Returns the red component in the range 0-255 in the default sRGB
  555        * space.
  556        * @return the red component.
  557        * @see #getRGB
  558        */
  559       public int getRed() {
  560           return (getRGB() >> 16) & 0xFF;
  561       }
  562   
  563       /**
  564        * Returns the green component in the range 0-255 in the default sRGB
  565        * space.
  566        * @return the green component.
  567        * @see #getRGB
  568        */
  569       public int getGreen() {
  570           return (getRGB() >> 8) & 0xFF;
  571       }
  572   
  573       /**
  574        * Returns the blue component in the range 0-255 in the default sRGB
  575        * space.
  576        * @return the blue component.
  577        * @see #getRGB
  578        */
  579       public int getBlue() {
  580           return (getRGB() >> 0) & 0xFF;
  581       }

109
2018-04-11 00:06





Ayırmak için bazı temel ikili aritmetiklere ihtiyacınız olacak:

int blue = rgb & 0xFF;
int green = (rgb >> 8) & 0xFF;
int red = (rgb >> 16) & 0xFF;

(Ya da muhtemelen başka bir şekilde, dürüstçe hatırlamıyorum ve belgeler bana anında cevap vermiyor)


8
2018-04-11 00:06



Haklı olduğuna inanıyorum. - HyperNeutrino


Basit renk manipülasyonları için kullanabilirsiniz

bufImg.getRaster().getPixel(x,y,outputChannels)

OutputChannels, getirilen pikseli saklamak için bir dizidir. Uzunluğu görüntünüzün gerçek kanal sayısına bağlıdır. Örneğin, bir RGB görüntünün 3 kanalı vardır; ve bir RGBA görüntüsünde 4 kanal bulunur.

Bu yöntemde 3 çıktı türü vardır: int, float ve double. 0 ~ 255 arasında bir renk değeri aralığı elde etmek için, gerçek parametre çıkış Kanallarınız bir int [] dizisi olmalıdır.


6
2018-04-11 03:25