Transformar String em bytes de 0 a 255

Oi gente, eu fiz um método q recebe como parametro uma string contendo 3 valores separados por virgulas. Por exemplo String s= “10,15,35”;
Ai que quero pegar esses valores e tranforma-los em bytes… Como devo fazer isso? O médoto q eu fiz deu o seguinte erro: java.lang.NumberFormatException: Value out of range. Value:“255” Radix:10


 public void rgbArray(String str){
        String s[] = str.split("\\,");
        r[cont]=Byte.valueOf(s[0]);
        g[cont]=Byte.valueOf(s[1]);
        b[cont]=Byte.valueOf(s[2]);
        cont++;
    }

Alguém sabe como me ajudar?

Olá, não tenho como fazer o teste aqui, porém pelo que eu li no JavaDoc 1.6
o metodo split de String recebe um Regex, então tente trocar o seu Regex de

str.split("\\,"); 

para

str.split(","); 

espero ter ajudado.

Mas eu não tô com problema no split… ele tah funcionando direito… o problema eh na conversão para bytes…

Pq vc está representando o rgb como String e não como um tipo mais natural, como o int?

Pq recebo a minha paleta de cores apartir de um header de um documento… leio o header como String… e depois tenho q criar tres vetores r,g, b para colocar no construtor do IndexColorModel

A classe Byte varia os valores de -127 até 127. Por isso, é impossível usar o parseBytes dessa forma.

Você deve fazer com o getInteger.

[code]String bytes = str.getBytes(Pattern.quote(","));
int r = Integer.parseInt(bytes[0]);
int g = Integer.parseInt(bytes[1]);
int b = Integer.parseInt(bytes[2]);

byte rByte = (byte)(r & 0xFF);
byte gByte = (byte)(g & 0xFF);
byte bByte = (byte)(b & 0xFF);
[/code]

Eu recomendo trabalhar com os canais de cor em inteiros mesmo. Assim você pode aplicar saturação nos seus calculos (por exemplo, é comum que multiplicações nos canais de cores gerem valores maiores que 255, que devem se fixar em 255).

Outra opção é trabalhar com a cor normalizada, ou seja, num float com intervalo de 0 até 1.

Usar inteiros também facilita na hora de compor novamente o inteiro de cor. É só uma questão de aplicar diretamente os shifts e combinar as cores com o operador |:

int cor = (r << 16) | (g << 8) | b;   //Considerando ARGB

mas o construtor do IndexColorModel recebe como parametro apenas o vetor em bytes e não em inteiros ou floats…

As linhas 6, 7 e 8 do primeiro código mostram como obter os 3 valores em bytes.

Tah certo se eu fizer assim:


 public void rgbArray(String str){
        String s[] = str.split("\\,");
        r[cont]=(byte)((Integer.parseInt(s[0]))& 0xFF);
        g[cont]=(byte)((Integer.parseInt(s[1]))& 0xFF);
        b[cont]=(byte)((Integer.parseInt(s[2]))& 0xFF);
        cont++;
    }

Está sim.

Obrigada!

E como eu faria o contrario? hehehheehe
Eu tenho bytes que variam de -127 à 127 e quero tranformá-los em inteiros, variando de 0 à 256?

Praticamente do mesmo jeito:

int valor = seuByte & 0xFF;

O valor vai variar de 0 até 255.

Eu fiz isso, mas meu programa não esta funcionando… Não sei se a lógica q está errada ou se é na parte das cores… Alguém pode dar uma ajudada?

class JanelaTest extends JFrame {

    private JLabel[] imagem;
    private JScrollPane scrollImage;
    private int location=0;

    public JanelaTest(byte[]r, byte []g, byte []b){
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(500,350);
        setVisible(true);
        imagem=new JLabel[r.length];
        for(int i=0; i<r.length; i++){
            imagem[i]= new JLabel();
            Color c = new Color((int)r[i]& 0xFF,(int)g[i]& 0xFF,(int)b[i]& 0xFF);
            imagem[i].setSize(70,70);
            imagem[i].setLocation(location,0);
            location=location+70;
            imagem[i].setBackground(c);
            imagem[i].setVisible(true);
            add(imagem[i]);
        }
        
    }

}

Dá algum erro? Aparece a cor errada? O que ocorre?

Não aparece absolutamente nada! Soh a janela vazia

Não faltou aí definir o tamanho do seu label, ou o gerenciador de layouts da sua janela?

Mas o tamanho domeu JLbale eu não tô definindo na linha:

imagem[i].setSize(70,70);

???

Esse comando é ignorado sem um setLayout(null); no início do seu JFrame.

eu mudei o código pra fazer um teste:

 public JanelaTest(byte[]r, byte []g, byte []b){
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(500,350);
        setVisible(true);
        setLayout(null);
        Color cTest = new Color ((int)r[2]& 0xFF,(int)g[2]& 0xFF,(int)b[2]& 0xFF);
        teste.setSize(70,70);
        teste.setLocation(0,0);
        //teste.setBackground(cTest);
        teste.setBackground(Color.ORANGE);
        teste.setVisible(true);
        teste.setBorder(BorderFactory.createLineBorder(Color.black, 1));
        add(teste);
}

E mesmo colocando teste.setBackground(Color.ORANGE) a minha cor de fundo não mudou