All Downloads are FREE. Search and download functionalities are using the official Maven repository.

se.llbit.resources.ImageLoader Maven / Gradle / Ivy

There is a newer version: 1.4.5
Show newest version
/* Copyright (c) 2010-2012 Jesper Öqvist 
 *
 * This file is part of Chunky.
 *
 * Chunky is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Chunky is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with Chunky.  If not, see .
 */
package se.llbit.resources;

import se.llbit.chunky.resources.BitmapImage;
import se.llbit.log.Log;

import javax.imageio.ImageIO;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

/**
 * Utility class for image loading.
 *
 * @author Jesper Öqvist ([email protected])
 */
public final class ImageLoader {
  /** The missing image is a 16x16 image with black background and red border and cross. */
  public final static BitmapImage missingImage;

  static {
    missingImage = new BitmapImage(16, 16);
    for (int y = 0; y < 16; ++y) {
      for (int x = 0; x < 16; ++x) {
        if (x == 0 || x == 15 || y == 0 || y == 15 || x == y || x == 16 - y) {
          missingImage.data[y * 16 + x] = 0xFFFF0000;
        } else {
          missingImage.data[y * 16 + x] = 0xFF000000;
        }
      }
    }
  }

  private ImageLoader() {
  }

  /**
   * Attempt to load an image with the given resource name.
   * If no image is found for that resource name the default
   * missing image is returned.
   *
   * @return Image for the given resource name
   */
  public static synchronized BitmapImage readNonNull(String resourceName) {
    URL url = ImageLoader.class.getResource("/" + resourceName);
    if (url == null) {
      Log.info("Could not find image: " + resourceName);
      return missingImage;
    }
    try {
      return read(url);
    } catch (IOException e) {
      Log.info("Failed to read image: " + resourceName, e);
      return missingImage;
    }
  }

  public static BitmapImage read(URL url) throws IOException {
    return fromBufferedImage(ImageIO.read(url));
  }

  public static BitmapImage read(InputStream in) throws IOException {
    return fromBufferedImage(ImageIO.read(in));
  }

  public static BitmapImage read(File file) throws IOException {
    return fromBufferedImage(ImageIO.read(file));
  }

  /**
   * Converts an AWT BufferedImage to BitmapImage.
   */
  private static BitmapImage fromBufferedImage(BufferedImage newImage) {
    int width = newImage.getWidth();
    int height = newImage.getHeight();
    BufferedImage image;
    if (newImage.getType() == BufferedImage.TYPE_INT_ARGB) {
      image = newImage;
    } else {
      // Convert to ARGB.
      image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
      Graphics g = image.createGraphics();
      g.drawImage(newImage, 0, 0, null);
      g.dispose();
    }
    // Copy the BufferedImage data into a new bitmap image.
    DataBufferInt dataBuffer = (DataBufferInt) image.getRaster().getDataBuffer();
    int[] data = dataBuffer.getData();
    BitmapImage bitmap = new BitmapImage(width, height);
    System.arraycopy(data, 0, bitmap.data, 0, width * height);
    return bitmap;
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy