fmz galera ? procurei aqui no forum mas na achei nada q possa me ajudar…
to tentando modificar um pixel de uma imagem usando o JAI.
…
PlanarImage pi;
pi = JAI.create(“fileload”, nomeImagem);
getContentPane().add(new DisplayJAI(pi));
int cor, pixel[] = {0, 0, 0,
Raster raster=pi.getData();
BufferedImage bi=null;
bi= pi.getAsBufferedImage();
Raster raster2=null;
WritableRaster rasterW=null;
rasterW=bi.getRaster();
SampleModel sampre=pi.getSampleModel();
RandomIter item=RandomIterFactory.create(pi,null);
for (int l=0 ; l<pi.getHeight() ; l++)
for (int c=0 ; c<pi.getWidth() ; c++)
{
item.getPixel(c,l,pixel);
raster.getPixel(c,l,pixel);
rasterW.getPixel(c,l,pixel);//pego o pixel
cor=(pixel[0]>127 ? 255 : 0);//converte em preto e branco
pixel[0]=pixel[1]=pixel[2]=cor;
rasterW.setPixel(c,l,pixel);//devolvo o pixel modificado para o WritableRaster
}
//como q faço para alterar o PlanarImage ???
Se você puder, não trabalhe com JAI modificando um pixel de cada vez. Isso é muito, MUITO, MUITO lento. Só faça isso para coisas muito pequenas (você vai mudar 10.000 pixels de uma imagem, não 10.000.000 pixels como é o caso típico).
Como você quer efetuar uma operação para converter uma imagem em tons de cinza para preto-e-branco, você tem de olhar isso na documentação, mas acho que é bem mais simples que essa coisa braçal de ficar mexendo em um pixel de cada vez.
Acho que é algo tão fácil quanto copiar sua imagem (em tons de cinza) para uma nova imagem (em preto-e-branco) e especificar alguns parâmetros (no seu caso o “threshold”, que é 127).
Pra transformar uma imagem em escala de cinza, basta fazer o seguinte:
public class escala_de_cinza {
public static PlanarImage converterCorParaCinza(PlanarImage src) {
PlanarImage dst = null;
double[][] matrix = {
{ .114D, 0.587D, 0.299D, 0 },
{ .114D, 0.587D, 0.299D, 0 },
{ .114D, 0.587D, 0.299D, 0 }
};
if ( src != null ) {
ParameterBlock pb = new ParameterBlock();
pb.addSource(src);
pb.add(matrix);
dst = JAI.create("bandcombine", pb, null);
}
return dst;
}
}
Para deixar uma imagem em somente preto em branco, ou seja, binarizá-la vc deve ter um limiar que significa um ponto onde vc quer que altere a imagem, fica da seguinte maneira:
public class PretoeBranco {
public PlanarImage getPretoeBrancoImage(PlanarImage source, int limiar) {
PlanarImage im;
byte[][] lut = new byte[3][256];
byte[][] newlut = new byte[3][256];
int i;
for (i = 0; i < limiar; i++ ) {
lut[0][i] = (byte)0; //R
lut[1][i] = (byte)0; //G
lut[2][i] = (byte)0; //B
}
for(i = limiar; i < 256; i++) {
lut[0][i] = (byte)255; //R
lut[1][i] = (byte)255; //G
lut[2][i] = (byte)255; //B
}
for (i = 0; i < 256; i++ ) {
int red = (int)lut[0][i]&0xFF;
int green = (int)lut[1][i]&0xFF;
int blue = (int)lut[2][i]&0xFF;
newlut[0][i] = clamp(red);
newlut[1][i] = clamp(green);
newlut[2][i] = clamp(blue);
}
im = colorize(newlut, source);
return im;
}
private PlanarImage colorize(byte[][] lt, PlanarImage source) {
LookupTableJAI lookup = new LookupTableJAI(lt);
ParameterBlock pb = new ParameterBlock();
pb.addSource(source);
pb.add(lookup);
PlanarImage dst = JAI.create("lookup", pb, null);
return dst;
}
final static private byte clamp(int v) {
if ( v > 255 ) {
return (byte)255;
} else if ( v < 0 ) {
return (byte)0;
} else {
return (byte)v;
}
}
}
como faço para extrair, ler os pixels de uma imagem em escala de cinza?