Jump to content

reduzir imagem


australopiteco
 Share

Recommended Posts

australopiteco

ola, eu tenho que fazer uma função que reduza o tamanho de uma ColorImage.A cor do pixel na imagem comprimida deve corresponder à média das cores dos pixeis do respetivo quadrado da imagem original.

static ColorImage Reduzi(ColorImage img, int x){

ColorImage imag = new ColorImage(img.getWidth()/x,img.getHeight()/x);

int cr = 0;

int cg = 0;

int cb = 0;

for(int i = 0;i < img.getWidth();i++){

for(int j = 0;j < img.getHeight();j++){

for(int l =i*x; l < i*x +x;l=l++){

for(int h =j * x;h < j*x +x;h++){

Color c =img.getColor(i,j);

cr += c.getR() ;

cg += c.getG() ;

cb += c.getB() ;

Color media = new Color(cr/(x*x),cg/(x*x),cb/(x*x));

imag.setColor(l,h,media);

}

}

}

}

return imag;

}

O problema é que o codigo não está a funcionar.Quando vou reduzir a imagem diz que passou dos valores das cores[0-255].

Se alguem me pudesse ajudar agradecia.

Link to comment
Share on other sites

HappyHippyHippo

qual o valor de x ?

o valor de x é o que tu quiseres meter

http://www.maisopiniao.com/perguntas-estupidas-merecem-respostas-parvas/

eu fiz uma pergunta muito concreta sobre um parâmetro da função, ao qual a tua resposta foi algo desprovida de qualquer tipo de informação.

isto porque olhando para o código:

// chamada que PARECE ser a origem o erro apresentado, já que essa informação também não foi providenciada ...
Color media = new Color(cr/(x*x),cg/(x*x),cb/(x*x));

o único elemento que que está em falta é realmente o valor de x.

agora, se estás à espera de milagres, estamos quase a chegar ao natal ...

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

australopiteco

O x é o fator que se vai introduzir para reduzir a imagem.Por exemplo eu quero reduzir a imagem para metade do seu tamanho, então o valor de x é 2 e a cada quadrado de lado 2 da imagem original correponde a um pixel da nova imagem.O problema é que a cor dos pixels da nova imagem corresponde à media das cores dos pixels de cada quadrado de lado 2 da imagem original.

Link to comment
Share on other sites

HappyHippyHippo

o problema de valores fora da gama esperada:

Color media = new Color(min(cr/(x*x), 255),
                       min(cg/(x*x), 255),
                       min(cb/(x*x), 255)); 

node : isto resolve somente o problema da gama de valores, que é a questão apresentada no tópico

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

australopiteco

Obrigado isso resolveu o problema, mas agora diz que tem um ponto invalido a meio da imagem. Eu penso que o problema esteja nos últimos dois for que percorrem os quadrados de lado x de modo a fazer a media das cores.Não sei se aquela expressão nos for(l = i*x) está certa.

Link to comment
Share on other sites

HappyHippyHippo

node : isto resolve somente o problema da gama de valores, que é a questão apresentada no tópico

Não sei se aquela expressão nos for(l = i*x) está certa.

não, os ciclos estão claramente errados.

o primeiro passo a fazer é : tenho que percorrer os pontos que vou criar e não os pontos "originais"

depois de estares a percorrer os pontos a serem "pintados", terás de percorrer os pontos que irão contribuir para a cor final

só assim terás a cor/média de cores que pretendes

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

australopiteco

O codigo está assim, eu mudei os ciclos mas não sei se estão certos.Agora voltou a dar erro com a gama de valores das cores.

static ColorImage Reduzir(ColorImage img, int x){

 ColorImage imag = new ColorImage(img.getWidth()/x,img.getHeight()/x);

 int cr = 0;
 int cg = 0;
 int cb = 0;
 for(int i = 0;i < imag.getWidth();i++){
  for(int j = 0;j < imag.getHeight();j++){
   for(int l =x; l < img.getWidth();l+=x){
 for(int h = x;h < img.getHeight();h+=x){
 Color c =img.getColor(l,h);
   cr += c.getR() ;
   cg += c.getG() ;
   cb += c.getB() ;


 Color media = new Color(Math.min(cr/(x*x),255),Math.min(cg/(x*x),255),Math.min(cb/(x*x),255));
  imag.setColor(i,j,media);
 }
   }
  }
 }

  return imag;
}
Link to comment
Share on other sites

australopiteco

Se eu quiser dividir a imagem para metade ( x=2) cada pixel da nova imagem equivale a um conjunto de quatro pixels da imagem original, portanto a media das cores de cada conjunto de quatro pixels da original equivale à cor de cada pixel da nova imagem.Penso que o meu problema é que eu não consigo criar um ciclo que percorra cada um desses conjuntos de pixels de modo a poder calcular a media.

Link to comment
Share on other sites

australopiteco

o codigo funciona quem precisar está aqui:

public static ColorImage Reduzir(ColorImage img, int x){

 ColorImage imag = new ColorImage(img.getWidth()/x,img.getHeight()/x);

 for(int i = 0;i < imag.getWidth();i++){
  for(int j = 0;j < imag.getHeight();j++){

   int cr = 0;
   int cg = 0;
   int cb = 0;

   for(int l =i*x; l < i*x+x; l++){
 for(int h =j*x; h <j*x+x; h++){

 Color c =img.getColor(l,h);
   cr += c.getR() ;
   cg += c.getG() ;
   cb += c.getB() ;	

 Color media = new Color(cr/(x*x),cg/(x*x),cb/(x*x)); 

  imag.setColor(i,j,media); 


 }
   }
  }
 }

   return imag;
}

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.