Bitmap Source code example in Android development
Package android.graphics;
Import Java.awt.image.BufferedImage;
Import Java.io.File;
Import java.io.IOException;
Import Java.io.InputStream;
Import Javax.imageio.ImageIO;
Public final class Bitmap extends _original_bitmap {
Private BufferedImage mimage;
Public Bitmap (File input) throws IOException {
Super (1, true, NULL,-1);
Mimage = Imageio.read (input);
}
Public Bitmap (InputStream is) throws IOException {
Super (1, true, NULL,-1);
Mimage = Imageio.read (IS);
}
Bitmap (bufferedimage image) {
Super (1, true, NULL,-1);
Mimage = image;
}
Public BufferedImage GetImage () {
return mimage;
}
-----Overriden Methods
public enum Config {
These native values must match up with the enum in SkBitmap.h
Alpha_8 (2),
rgb_565 (4),
argb_4444 (5),
argb_8888 (6);
Config (int ni) {
This.nativeint = NI;
}
final int nativeint;
/* Package */static Config nativetoconfig (int ni) {
return Sconfigs[ni];
}
private static Config sconfigs[] = {
NULL, NULL, ALPHA_8, NULL, rgb_565, argb_4444, argb_8888
};
}
@Override
public int getwidth () {
return Mimage.getwidth ();
}
@Override
public int getheight () {
return Mimage.getheight ();
}
/**
* Returns an immutable bitmap from the source bitmap. The new bitmap may
* Be the same object as source, or a copy of may have been made.
*/
public static Bitmap CreateBitmap (Bitmap src) {
Return CreateBitmap (SRC, 0, 0, src.getwidth (), src.getheight (), null, FALSE);
}
/**
* Returns an immutable bitmap from the specified subset of the source
* Bitmap. The new bitmap may is the same object as source, or a copy may
* have been made.
*
* @param source The bitmap we are subsetting
* @param x The coordinate of the the ' the ' pixel in source
* @param y coordinate of the ' the ' the ' pixel in source
* @param width The number of pixels in each row
* @param height the number of rows
*/
public static Bitmap CreateBitmap (Bitmap source, int x, int y,
int width, int height) {
return new Bitmap (Source.mImage.getSubimage (x, y, width, height));
}
/**
* Returns an immutable bitmap from subset of the source bitmap,
* Transformed by the optional matrix.
*
* @param source The bitmap we are subsetting
* @param x The coordinate of the the ' the ' pixel in source
* @param y coordinate of the ' the ' the ' pixel in source
* @param width The number of pixels in each row
* @param height the number of rows
* @param m Option matrix to is applied to the pixels
* @param filter True if the source should be filtered.
* only applies if the matrix contains more than just
* translation.
* @return A bitmap that represents the specified subset of source
* @throws IllegalArgumentException if the x, y, width, height values are
* Outside of the dimensions of the source bitmap.
*/
public static Bitmap CreateBitmap (Bitmap source, int x, int y, int width,
int height, Matrix m, Boolean filter) {
Checkxysign (x, y);
Checkwidthheight (width, height);
if (x + width > source.getwidth ()) {
throw New IllegalArgumentException (
"X + width must be <= bitmap.width ()");
}
if (y + height > source.getheight ()) {
throw New IllegalArgumentException (
"Y + height must be <= bitmap.height ()");
}
Check if we can just return to our argument unchanged
if (!source.ismutable () && x = 0 && y = = 0
&& width = = source.getwidth () && height = source.getheight ()
&& (M = = NULL | | m.isidentity ()) {
return source;
}
if (m = = NULL | | m.isidentity ()) {
return new Bitmap (Source.mImage.getSubimage (x, y, width, height));
}
int neww = width;
int NEWH = height;
Paint Paint;
Rect SRCR = new Rect (x, y, x + width, y + height);
RECTF dstr = new RECTF (0, 0, width, height);
/* The DST should have alpha if the SRC does, or if our matrix
doesn ' t preserve rectness
*/
Boolean hasalpha = Source.hasalpha () | | !m.rectstaysrect ();
RECTF devicer = new RECTF ();
M.maprect (Devicer, DSTR);
NEWW = Math.Round (Devicer.width ());
NEWH = Math.Round (Devicer.height ());
Canvas Canvas = new Canvas (NEWW, NEWH);
Canvas.translate (-devicer.left,-devicer.top);
Canvas.concat (m);
Paint = new paint ();
Paint.setfilterbitmap (filter);
if (!m.rectstaysrect ()) {
Paint.setantialias (TRUE);
}
Canvas.drawbitmap (source, SRCR, dstr, paint);
return new Bitmap (Canvas.getimage ());
}
/**
* Returns a mutable bitmap with the specified width and height.
*
* @param width of the bitmap
* @param the height of the bitmap
* @param config The bitmap config to create.
* @throws IllegalArgumentException if the width or height are <= 0
*/
public static Bitmap CreateBitmap (int width, int height, config config) {
return new Bitmap (new BufferedImage (width, height, bufferedimage.type_int_argb));
}
/**
* Returns a immutable bitmap with the specified width and height, with each
* Pixel value set to the corresponding value in the colors array.
*
* @param colors Array of {@link Color} used to initialize the pixels.
* @param offset number of values to skip before the the
* Array of colors.
* @param stride Number of colors in the array between rows (must is >=
* Width or <=-width).
* @param width of the bitmap
* @param the height of the bitmap
* @param config The bitmap config to create. If the config does not
* Support Per-pixel alpha (e.g. rgb_565), then the alpha
* bytes in the colors[] 'll be ignored (assumed to be FF)
* @throws IllegalArgumentException if the width or height are <= 0, or if
* The color array ' s length is less than the number of pixels.
*/
public static Bitmap CreateBitmap (int colors[], int offset, int stride,
int width, int height, config config) {
Checkwidthheight (width, height);
if (Math.Abs (Stride) < width) {
throw new IllegalArgumentException ("ABS (STRIDE) must be >= width");
}
int lastscanline = offset + (height-1) * STRIDE;
int length = Colors.length;
if (Offset < 0 | | (offset + width > length)
|| Lastscanline < 0
|| (lastscanline + width > Length)) {
throw new ArrayIndexOutOfBoundsException ();
}
Todo:create an immutable bitmap ...
throw new Unsupportedoperationexception ();
}
/**
* Returns a immutable bitmap with the specified width and height, with each
* Pixel value set to the corresponding value in the colors array.
*
* @param colors Array of {@link Color} used to initialize the pixels.
* This array must is at least as large as width * height.
* @param width of the bitmap
* @param the height of the bitmap
* @param config The bitmap config to create. If the config does not
* Support Per-pixel alpha (e.g. rgb_565), then the alpha
* bytes in the colors[] 'll be ignored (assumed to be FF)
* @throws IllegalArgumentException if the width or height are <= 0, or if
* The color array ' s length is less than the number of pixels.
*/
public static Bitmap CreateBitmap (int colors[], int width, int height,
Config config) {
return CreateBitmap (colors, 0, width, width, height, config);
}
public static Bitmap Createscaledbitmap (Bitmap src, int dstwidth,
int Dstheight, Boolean filter) {
Matrix m;
Synchronized (Bitmap.class) {
Small pool of just 1 matrix
m = Sscalematrix;
Sscalematrix = null;
}
if (M = = null) {
m = new Matrix ();
}
Final int width = src.getwidth ();
Final int height = src.getheight ();
Final float SX = dstwidth/(float) width;
Final float sy = dstheight/(float) height;
M.setscale (SX, SY);
Bitmap B = bitmap.createbitmap (src, 0, 0, width, height, m, filter);
Synchronized (Bitmap.class) {
Do we need to check for null? Why not just assign everytime?
if (Sscalematrix = = null) {
Sscalematrix = m;
}
}
return b;
}
}