public class EncodedImage

  1. Object
  2. Image
  3. EncodedImage

ImplementsActionSource

Known subtypesFileEncodedImage, FileEncodedImageAsync, ReplaceableImage, StorageImage, StorageImageAsync, ComponentImage.EncodedWrapper, URLImage

EncodedImage is the workhorse of Codename One. Images returned from resource files are EncodedImage and many API’s expect it.

EncodedImage is effectively an image that is “hidden” and extracted as needed to remove the memory overhead associated with loaded image. When creating an EncodedImage only the PNG (or JPEG etc.) is loaded to an array in RAM. Normally, such images are very small (relatively) so they can be kept in memory without much overhead.

When image information is needed (pixels) the image is decoded into RAM and kept in a weak/sort reference (see com.codename1.ui.Display#createSoftWeakRef(java.lang.Object)). This allows the image to be cached for performance and allows the garbage collector to reclaim it when the memory becomes scarce.

Since the fully decoded image can be pretty big (width X height X 4) the ability to store just the encoded image can be pretty stark. E.g. A standard 50x100 image will take up 20,000 bytes of RAM for a standard image but an EncodedImage can reduce that to 1kb-2kb of RAM.

When drawing an EncodedImage it checks the weak reference cache and if the image is cached then it is shown otherwise the image is loaded the encoded image cache it then drawn.

EncodedImage is not final and can be derived to produce complex image fetching strategies e.g. the com.codename1.ui.URLImage class that can dynamically download its content from the web.

EncodedImage can be instantiated via the create methods in the class. Pretty much any image can be converted into an EncodedImage via the boolean) method.

EncodedImage Locking

Naturally loading the image is more expensive so we want the images that are on the current form to remain in cache (otherwise GC will thrash a lot). That’s where #lock() kicks in, when #lock() is active we keep a hard reference to the actual native image so it won’t get GC’d. This significantly improves performance!

Internally this is invoked automatically for background images, icons etc. which results in a huge performance boost. This makes sense since these images are currently showing and they will be in RAM anyway. However, if you use a complex renderer or custom drawing UI you should #lock() your images where possible!

To verify that locking might be a problem you can launch the performance monitor tool (accessible from the simulator menu), if you get log messages that indicate that an unlocked image was drawn you might have a problem.

Constructors

protected EncodedImage(int width, int height)Allows subclasses to create more advanced variations of this class that lazily store the data in an arbitrary location.

Methods

public static EncodedImage createMulti(int[] dpis, byte[][] data)Deprecated Creates an encoded image that acts as a multi-image, DO NOT USE THIS METHOD.
public static EncodedImage createFromImage(Image i, boolean jpeg)Converts an image to encoded image
public static Image createFromRGB(int[] argb, int width, int height, boolean jpeg)Tries to create an encoded image from RGB which is more efficient, however if this fails it falls back to regular RGB image.
public static EncodedImage create(byte[] data)Creates an image from the given byte array
public static EncodedImage create(byte[] data, int width, int height, boolean opacity)Creates an image from the given byte array with the variables set appropriately.
public static EncodedImage create(InputStream i) throws IOExceptionCreates an image from the input stream
public static EncodedImage create(InputStream i, int size) throws IOExceptionCreates an image from the input stream, this version of the method is somewhat faster than the version that doesn’t accept size
public static EncodedImage create(String i) throws IOExceptionCreates an image from the input stream
protected void resetCache()A subclass might choose to load asynchroniously and reset the cache when the image is ready.
public void dispose()Releases the decoded image cache and the encoded byte data backing this instance.
public boolean isDisposed()Returns true if dispose has been called on this image.
public byte[] getImageData()Returns the byte array data backing the image allowing the image to be stored and discarded completely from RAM.
public Object getImage()Returns the platform specific image implementation, warning the implementation class can change between revisions of Codename One and platforms.
protected Image getInternal()Returns the actual image represented by the encoded image, this image will be cached in a weak/soft reference internally.
public boolean isLocked()Returns true if the image is locked
public void asyncLock(Image internal)Async lock is the equivalent of a lock operation, however it uses the given image as the hard cache and performs the actual image loading asynchronously.
public void lock()This callback indicates that a component pointing at this image is initialized, this allows an image to make performance sensitive considerations e.g. an encoded image might choose to cache itself in RAM.
public void unlock()This callback indicates that a component pointing at this image is now deinitilized This method may be invoked multiple times.
public Image subImage(int x, int y, int width, int height, boolean processAlpha)Extracts a subimage from the given image allowing us to breakdown a single large image into multiple smaller images in RAM, this actually creates a standalone version of the image for use.
public Image rotate(int degrees)Returns an instance of this image rotated by the given number of degrees.
public Image modifyAlpha(byte alpha)Creates a new image instance with the alpha channel of opaque/translucent pixels within the image using the new alpha value.
public Image modifyAlpha(byte alpha, int removeColor)Creates a new image instance with the alpha channel of opaque/translucent pixels within the image using the new alpha value.
public Graphics getGraphics()If this is a mutable image a graphics object allowing us to draw on it is returned.
public int getWidth()Returns the width of the image
public int getHeight()Returns the height of the image
protected void drawImage(Graphics g, Object nativeGraphics, int x, int y)Callback invoked internally by Codename One to draw the image/frame onto the display.
protected void drawImage(Graphics g, Object nativeGraphics, int x, int y, int w, int h)Callback invoked internally by Codename One to draw the image/frame onto the display.
public void toRGB(RGBImage image, int destX, int destY, int x, int y, int width, int height)Extracts data from this image into the given RGBImage
public Image scaledWidth(int width)Scales the image to the given width while updating the height based on the aspect ratio of the width
public Image scaledHeight(int height)Scales the image to the given height while updating the width based on the aspect ratio of the height
public Image scaledSmallerRatio(int width, int height)Scales the image while maintaining the aspect ratio to the smaller size image
public EncodedImage scaledEncoded(int width, int height)Performs scaling using ImageIO to generate an encoded Image
public Image scaled(int width, int height)Returns a scaled version of this image image using the given width and height, this is a fast algorithm that preserves translucent information.
public void scale(int width, int height)Scale the image to the given width and height, this is a fast algorithm that preserves translucent information
public boolean isAnimation()Returns true if this is an animated image
public boolean isOpaque()Indicates whether this image is opaque or not

Inherited methods

Constructor details

EncodedImage

protected EncodedImage(int width, int height)
Allows subclasses to create more advanced variations of this class that lazily store the data in an arbitrary location.

Parameters

width int
-1 if unknown ideally the width/height should be known in advance
height int
-1 if unknown ideally the width/height should be known in advance

Method details

createMulti

public static EncodedImage createMulti(int[] dpis, byte[][] data)
Deprecated. this method is meant for internal use only, it would be very expensive to use this method for real applications. Its here for simulators and development purposes where screen DPI/resolution can vary significantly in runtime (something that just doesn’t happen on devices).
Creates an encoded image that acts as a multi-image, DO NOT USE THIS METHOD. Its for internal use to improve the user experience of the simulator

Parameters

dpis int[]
device DPI’s
data byte[][]
the data matching each multi-image DPI

Returns

an encoded image that acts as a multi-image in runtime

createFromImage

public static EncodedImage createFromImage(Image i, boolean jpeg)
Converts an image to encoded image

Parameters

i Image
image
jpeg boolean
true to try and set jpeg, will do a best effort but this isn’t guaranteed

Returns

an encoded image or null

createFromRGB

public static Image createFromRGB(int[] argb, int width, int height, boolean jpeg)
Tries to create an encoded image from RGB which is more efficient, however if this fails it falls back to regular RGB image. This method is slower than creating an RGB image (not to be confused with the RGBImage class which is something ENTIRELY different!).

Parameters

argb int[]
an argb array
width int
the width for the image
height int
the height for the image
jpeg boolean
uses jpeg format internally which is opaque and could be faster/smaller

Returns

an image which we hope is an encoded image

create

public static EncodedImage create(byte[] data)
Creates an image from the given byte array

Parameters

data byte[]
the data of the image

Returns

newly created encoded image

create

public static EncodedImage create(byte[] data, int width, int height, boolean opacity)
Creates an image from the given byte array with the variables set appropriately. This saves LWUIT allot of resources since it doesn’t need to actually traverse the pixels of an image to find out details about it.

Parameters

data byte[]
the data of the image
width int
the width of the image
height int
the height of the image
opacity boolean
true for an opaque image

Returns

newly created encoded image

create

public static EncodedImage create(InputStream i) throws IOException
Creates an image from the input stream

Parameters

i InputStream
the input stream

Returns

newly created encoded image

Throws

java.io.IOException
if thrown by the input stream

create

public static EncodedImage create(InputStream i, int size) throws IOException
Creates an image from the input stream, this version of the method is somewhat faster than the version that doesn’t accept size

Parameters

i InputStream
the input stream
size int
the size of the stream

Returns

newly created encoded image

Throws

java.io.IOException
if thrown by the input stream

create

public static EncodedImage create(String i) throws IOException
Creates an image from the input stream

Parameters

i String
the resource

Returns

newly created encoded image

Throws

java.io.IOException
if thrown by the input stream

resetCache

protected void resetCache()
A subclass might choose to load asynchroniously and reset the cache when the image is ready.

dispose

public void dispose()
Releases the decoded image cache and the encoded byte data backing this instance. After dispose, attempting to draw or query this image will throw IllegalStateException. Intended for tight memory budgets where the caller knows the image is no longer needed; see Image.dispose.

isDisposed

public boolean isDisposed()
Returns true if dispose has been called on this image.

getImageData

public byte[] getImageData()
Returns the byte array data backing the image allowing the image to be stored and discarded completely from RAM.

Returns

byte array used to create the image, e.g. encoded PNG, JPEG etc.

getImage

public Object getImage()
Returns the platform specific image implementation, warning the implementation class can change between revisions of Codename One and platforms.

Returns

platform specific native implementation for this image object

getInternal

protected Image getInternal()
Returns the actual image represented by the encoded image, this image will be cached in a weak/soft reference internally. This method is useful to detect when the system actually created an image instance. You shouldn’t invoke this method manually!

Returns

drawable image instance

isLocked

public boolean isLocked()
Returns true if the image is locked

Returns

false by default

asyncLock

public void asyncLock(Image internal)
Async lock is the equivalent of a lock operation, however it uses the given image as the hard cache and performs the actual image loading asynchronously. On completion this method will invoke repaint on the main form if applicable.

Parameters

internal Image
the image to show while the actual image loads.

lock

public void lock()
This callback indicates that a component pointing at this image is initialized, this allows an image to make performance sensitive considerations e.g. an encoded image might choose to cache itself in RAM. This method may be invoked multiple times.

unlock

public void unlock()
This callback indicates that a component pointing at this image is now deinitilized This method may be invoked multiple times.

subImage

public Image subImage(int x, int y, int width, int height, boolean processAlpha)
Extracts a subimage from the given image allowing us to breakdown a single large image into multiple smaller images in RAM, this actually creates a standalone version of the image for use.

Parameters

x int
the x offset from the image
y int
the y offset from the image
width int
the width of internal images
height int
the height of internal images
processAlpha boolean
whether alpha should be processed as well as part of the cutting

Returns

An array of all the possible images that can be created from the source

rotate

public Image rotate(int degrees)

Returns an instance of this image rotated by the given number of degrees. By default 90 degree angle divisions are supported, anything else is implementation dependent. This method assumes a square image. Notice that it is inefficient in the current implementation to rotate to non-square angles,

E.g. rotating an image to 45, 90 and 135 degrees is inefficient. Use rotatate to 45, 90 and then rotate the 45 to another 90 degrees to achieve the same effect with less memory.

Parameters

degrees int
A degree in right angle must be larger than 0 and up to 359 degrees

Returns

new image instance with the closest possible rotation

modifyAlpha

public Image modifyAlpha(byte alpha)
Creates a new image instance with the alpha channel of opaque/translucent pixels within the image using the new alpha value. Transparent (alpha == 0) pixels remain transparent. All other pixels will have the new alpha value.

Parameters

alpha byte
New value for the entire alpha channel

Returns

Translucent/Opaque image based on the alpha value and the pixels of this image

modifyAlpha

public Image modifyAlpha(byte alpha, int removeColor)
Creates a new image instance with the alpha channel of opaque/translucent pixels within the image using the new alpha value. Transparent (alpha == 0) pixels remain transparent. All other pixels will have the new alpha value.

Parameters

alpha byte
New value for the entire alpha channel
removeColor int
pixels matching this color are made transparent (alpha channel ignored)

Returns

Translucent/Opaque image based on the alpha value and the pixels of this image

getGraphics

public Graphics getGraphics()
If this is a mutable image a graphics object allowing us to draw on it is returned.

Returns

Graphics object allowing us to manipulate the content of a mutable image

getWidth

public int getWidth()
Returns the width of the image

Returns

the width of the image

getHeight

public int getHeight()
Returns the height of the image

Returns

the height of the image

drawImage

protected void drawImage(Graphics g, Object nativeGraphics, int x, int y)
Callback invoked internally by Codename One to draw the image/frame onto the display. Image subclasses can override this method to perform drawing of custom image types.

Parameters

g Graphics
the graphics object
nativeGraphics Object
the underlying native graphics which might be essential for some image types
x int
the x coordinate
y int
the y coordinate

drawImage

protected void drawImage(Graphics g, Object nativeGraphics, int x, int y, int w, int h)
Callback invoked internally by Codename One to draw the image/frame onto the display. Image subclasses can override this method to perform drawing of custom image types.

Parameters

g Graphics
the graphics object
nativeGraphics Object
the underlying native graphics which might be essential for some image types
x int
the x coordinate
y int
the y coordinate
w int
the width to occupy
h int
the height to occupy

toRGB

public void toRGB(RGBImage image, int destX, int destY, int x, int y, int width, int height)
Extracts data from this image into the given RGBImage

Parameters

image RGBImage
RGBImage that would receive pixel data
destX int
x location within RGBImage into which the data will be written
destY int
y location within RGBImage into which the data will be written
x int
location within the source image
y int
location within the source image
width int
size of the image to extract from the source image
height int
size of the image to extract from the source image

scaledWidth

public Image scaledWidth(int width)
Scales the image to the given width while updating the height based on the aspect ratio of the width

Parameters

width int
the given new image width

Returns

the newly created image

scaledHeight

public Image scaledHeight(int height)
Scales the image to the given height while updating the width based on the aspect ratio of the height

Parameters

height int
the given new image height

Returns

the newly created image

scaledSmallerRatio

public Image scaledSmallerRatio(int width, int height)
Scales the image while maintaining the aspect ratio to the smaller size image

Parameters

width int
the given new image width
height int
the given new image height

Returns

the newly created image

scaledEncoded

public EncodedImage scaledEncoded(int width, int height)
Performs scaling using ImageIO to generate an encoded Image

Parameters

width int
the width of the image, -1 to scale based on height and preserve aspect ratio
height int
the height of the image, -1 to scale based on width and preserve aspect ratio

Returns

new encoded image

scaled

public Image scaled(int width, int height)
Returns a scaled version of this image image using the given width and height, this is a fast algorithm that preserves translucent information. The method accepts -1 to preserve aspect ratio in the given axis.

Parameters

width int
width for the scaling
height int
height of the scaled image

Returns

new image instance scaled to the given height and width

scale

public void scale(int width, int height)
Scale the image to the given width and height, this is a fast algorithm that preserves translucent information

Parameters

width int
width for the scaling
height int
height of the scaled image

isAnimation

public boolean isAnimation()
Returns true if this is an animated image

Returns

true if this image represents an animation

isOpaque

public boolean isOpaque()
Indicates whether this image is opaque or not

Returns

true if the image is completely opqaque which allows for some heavy optimizations