Bom dia, já estou acostuma a trabalha com imagens com transparecia no Java, carregando a imagem no BufferedImage.
Estou usando a SDK 1.9.7
Estou tentando fazer o seguinte:
Pegar uma imagem escaneada (Sem camada alpha), e carregar em um BufferedImage, após carrega passo pixel a pixel analisando as cores, e de acordo com os canais “r”, “g” e “b” eu crio um canal “alpha”, como a imagem original não possuía canal alpha eu crio uma nova imagem com mesmo tamanho e largura, essa possui o canal alpha pela configuração “TYPE_INT_ARGB”, os pixels são guardados em um array de inteiro na ordem ARGB, seguindo o padrão de pixel indicado na biblioteca do java (Nlinha*(width) + Ncoluna).
O problema e que a imagem gerada além de não possuir camada alpha fica com as cores distorcidas, as imagens são geradas diretamente pela escanear.
eu sempre usei essa classe para pegar os pixels no OpenGl o que me permitia controle da cor, nunca tive esse problema com distorção de corres.
public static void setImagems() {
int cor_atual, tmp_color;
byte a, r, g, b;
String new_file, new_file_type;
int[] colors;
String[] partes_caminho;
File folder, img_saida;
BufferedImage image, new_image;
folder = new File("tmp");
if(!folder.exists() || !folder.isDirectory()){
return;
}
for(File atu: folder.listFiles()){
if(atu != null && isImage(atu.getAbsolutePath())){
//*// auto_block
try {
image = ImageIO.read(atu); //pode não ter camada alfa
colors = new int[image.getWidth()*image.getHeight()];
image.getRGB(0, 0, image.getWidth(), image.getHeight(), colors, 0, image.getWidth());
new_image = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
for(int row = 0; row < image.getHeight(); row++){
for(int col = 0; col < image.getWidth(); col++){
cor_atual = colors[(row*image.getWidth() + col)]; //argb
//a = (byte)((cor_atual >> 24)& 0xff);
r = (byte)((cor_atual >> 16)& 0xff);
g = (byte)((cor_atual >> 8)& 0xff);
b = (byte)((cor_atual)& 0xff);
a = (byte)((int)((r+g+b)/3)); //o int foi inserido para que o byte não seja o final de uma float e sim de um int
//a = (byte)(255 - a);
//o alfa é calculado considerando a quantidade de cor existente na cor atual ou seja o lado branco
tmp_color = 0;
tmp_color = (tmp_color | a) << 8;
tmp_color = (tmp_color | r) << 8;
tmp_color = (tmp_color | g) << 8;
tmp_color = (tmp_color | b);
colors[(row*image.getWidth() + col)] = tmp_color;
}
}
new_image.setRGB(0, 0, image.getWidth(), image.getHeight(), colors, 0, image.getWidth());
//Agora que ja corrigimos a imagem vamos criar a nova
partes_caminho = Str.splitArray('\\', atu.getAbsolutePath());
new_file = ""; // vai armazenar o novo arquivo
for(int cont = 0; cont < (partes_caminho.length -1); cont++){
new_file += partes_caminho[cont] +'\\';
}
if(!Str.isFirstText("new ", partes_caminho[partes_caminho.length-1])){
new_file += "new " + partes_caminho[partes_caminho.length-1];
img_saida = new File(new_file);
partes_caminho = Str.splitArray('.', atu.getAbsolutePath());
new_file_type = partes_caminho[partes_caminho.length-1];
new_file_type = new_file_type.toUpperCase();
ImageIO.write(new_image, new_file_type, img_saida);
}
} catch (IOException ex) {
Logger.getLogger(ConverteBrancoEmAlpha.class.getName()).log(Level.SEVERE, null, ex);
}
//*/
}
}
}