2017-01-09 3 views
3

Ожидаемый результат моего кода (как показано ниже):Неудачная попытка изменить значение альфа пикселей BufferedImage


до того 255
после 0


Но фактический выпуск:


до того 255
после 255


Я ожидаю, что после того, как будет что-то другое, чем 255, потому что я пытался явно установить нижний бит пикселей 0. Надеясь анализ того, что может не работать.


File fimin = new File("C:\\sample.png"); 
BufferedImage img = null; 
img = ImageIO.read(fimin); 
int width = img.getWidth(); 
int height = img.getHeight(); 
int val, alpha; 

System.out.println("before" + (((img.getRGB(0, 0)) >> 24) & 0xff)); 

for(int i = 0; i < width; i++) { 
    for(int j = 0; j < height; j++) { 
     val = 0; 
     val = img.getRGB(i, j); 
     val &= 0xfeffffff;//set lower bit ofalpha to zero 
     img.setRGB(i, j, val); 
    } 
} 
System.out.println("after" + (((img.getRGB(0, 0)) >> 24) & 0xff)); 
+0

Иногда я не должен быть рядом с компьютерами:} – user2864740

+1

Какой смысл устанавливать 'val' в 0 каждый раз? – shmosel

+0

Привет Сай, чтобы помочь @gpasch помочь, если его ответ поможет вам, пожалуйста, нажмите стрелку вверх, чтобы «поднять» свой ответ, и нажмите √ рядом с ним, чтобы показать, что это «принятый ответ» (ответ, который работает для вы), и если вы считаете, что мой вклад был хорошим, пожалуйста, подтвердите свой ответ. Вот как работает этот сайт, чтобы помочь друг другу продвинуться вперед и добиться прогресса. – clearlight

ответ

2

Считанные изображение не типа ARGB.

Чтобы убедиться, что у вас есть изображение типа ARGB сделать это:

BufferedImage b2=new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB); 
    b2.getGraphics().drawImage(img, 0, 0, null); 

Теперь вы можете изменить альфа:

System.out.println("before"+(((b2.getRGB(0,0))>>24)&0xff)+" "+img.getType()+" "+BufferedImage.TYPE_INT_RGB+" "+BufferedImage.TYPE_INT_ARGB); 
    int val=b2.getRGB(0, 0); 
    val&=0xfeffffff;//set lower bit ofalpha to zero 
    b2.setRGB(0, 0, val); 
    System.out.println("after"+(((b2.getRGB(0,0))>>24)&0xff));  
0

Я попробовал, и использовать PNG, и она работала как и следовало ожидать:

  • перед: 255
  • после: 254

Возможно, изображение, которое я использовал, имело пиксельные байты в ожидаемом порядке, ARGB, тогда как загруженный файл изображения не был? Если это так, ответ @gpasch's, вероятно, позволит вашему коду обрабатывать больше форматов изображений (например, позволяет управлять представлением изображения в памяти).

import java.io.File; 
import java.awt.image.BufferedImage; 
import javax.imageio.ImageIO; 

public class image { 

    public static void main(String args[]) { 

     if (args.length < 1) { 
      System.err.println("Usage: java image <image filepath>\n"); 
      System.exit(-1); 
     } 

     File imageFilename = new File(args[0]); 

     BufferedImage img = null; 
     try { 
      img = ImageIO.read(imageFilename); 
     } catch (Exception c) { 
      System.out.println("Error reading image file " + imageFilename); 
     } 

     int width = img.getWidth(); 
     int height = img.getHeight(); 
     int val, alpha; 

     System.out.println("Lower byte before: " + (((img.getRGB(0, 0)) >> 24) & 0xff)); 

     for(int i = 0; i < width; i++) { 
      for(int j = 0; j < height; j++) { 
       val = img.getRGB(i, j); 
       val &= 0xfeffffff;//set lower bit ofalpha to zero 
       img.setRGB(i, j, val); 
      }  
     }  
     System.out.println("Lower byte after: " + (((img.getRGB(0, 0)) >> 24) & 0xff)); 
    } 
} 
Смежные вопросы