code_junkie

Set BufferedImage alpha mask in Java

Nov 11th, 2011
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.74 KB | None | 0 0
  1. final int width = image.getWidth();
  2. int[] imgData = new int[width];
  3. int[] maskData = new int[width];
  4.  
  5. for (int y = 0; y < image.getHeight(); y++) {
  6. // fetch a line of data from each image
  7. image.getRGB(0, y, width, 1, imgData, 0, 1);
  8. mask.getRGB(0, y, width, 1, maskData, 0, 1);
  9. // apply the mask
  10. for (int x = 0; x < width; x++) {
  11. int color = imgData[x] & 0x00FFFFFF; // mask away any alpha present
  12. int mask = (maskData[x] & 0x00FF0000) << 8; // shift red into alpha bits
  13. color |= mask;
  14. imgData[x] = color;
  15. }
  16. // replace the data
  17. image.setRGB(0, y, width, 1, imgData, 0, 1);
  18. }
  19.  
  20. TestMask() throws IOException
  21. {
  22. m_images = new BufferedImage[3];
  23. m_images[0] = ImageIO.read(new File("E:/Documents/images/map.png"));
  24. m_images[1] = ImageIO.read(new File("E:/Documents/images/mapMask3.png"));
  25. Image transpImg = TransformGrayToTransparency(m_images[1]);
  26. m_images[2] = ApplyTransparency(m_images[0], transpImg);
  27. }
  28.  
  29. private Image TransformGrayToTransparency(BufferedImage image)
  30. {
  31. ImageFilter filter = new RGBImageFilter()
  32. {
  33. public final int filterRGB(int x, int y, int rgb)
  34. {
  35. return (rgb << 8) & 0xFF000000;
  36. }
  37. };
  38.  
  39. ImageProducer ip = new FilteredImageSource(image.getSource(), filter);
  40. return Toolkit.getDefaultToolkit().createImage(ip);
  41. }
  42.  
  43. private BufferedImage ApplyTransparency(BufferedImage image, Image mask)
  44. {
  45. BufferedImage dest = new BufferedImage(
  46. image.getWidth(), image.getHeight(),
  47. BufferedImage.TYPE_INT_ARGB);
  48. Graphics2D g2 = dest.createGraphics();
  49. g2.drawImage(image, 0, 0, null);
  50. AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.DST_IN, 1.0F);
  51. g2.setComposite(ac);
  52. g2.drawImage(mask, 0, 0, null);
  53. g2.dispose();
  54. return dest;
  55. }
  56.  
  57. public void applyGrayscaleMaskToAlpha(BufferedImage image, BufferedImage mask)
  58. {
  59. int width = image.getWidth();
  60. int height = image.getHeight();
  61.  
  62. int[] imagePixels = image.getRGB(0, 0, width, height, null, 0, width);
  63. int[] maskPixels = mask.getRGB(0, 0, width, height, null, 0, width);
  64.  
  65. for (int i = 0; i < imagePixels.length; i++)
  66. {
  67. int color = imagePixels[i] & 0x00ffffff; // Mask preexisting alpha
  68. int alpha = maskPixels[i] << 24; // Shift green to alpha
  69. imagePixels[i] = color | alpha;
  70. }
  71.  
  72. image.setRGB(0, 0, width, height, imagePixels, 0, width);
  73. }
  74.  
  75. for (int y = 0; y < image.getHeight(); y++) {
  76. for (int x = 0; x < image.getWidth(); x++) {
  77. Color c = new Color(image.getRGB(x, y));
  78. Color maskC = new Color(mask.getRGB(x, y));
  79. Color maskedColor = new Color(c.getRed(), c.getGreen(), c.getBlue(),
  80. maskC.getRed());
  81. resultImg.setRGB(x, y, maskedColor.getRGB());
  82. }
  83. }
Add Comment
Please, Sign In to add comment