walhalla.image
Scalr
Class used to implement performant, high-quality and intelligent image scaling and manipulation algorithms in native Java 2D.
This class utilizes the Java2D "best practices" for image manipulation, ensuring that all operations (even most user-providedBufferedImageOp
s) are hardware accelerated if provided by the platform and host-VM.
Image Quality
This class implements a few different methods for scaling an image, providing either the best-looking result, the fastest result or a balanced result between the two depending on the scaling hint provided (seeMethod
).
This class also implements an optimized version of the incremental scaling
algorithm presented by Chris Campbell in his Perils of
Image.getScaledInstance() article in order to give the best-looking image
resize results (e.g. generating thumbnails that aren't blurry or jagged).
The results generated by imgscalr using this method, as compared to a single
RenderingHints#VALUE_INTERPOLATION_BICUBIC
scale operation look much
better, especially when using the Method#ULTRA_QUALITY
method.
Method#AUTOMATIC
method will this class
look at the size of the image before selecting an approach to scaling the
image. If Method#QUALITY
is specified, the best-looking algorithm
possible is always used.
Minor modifications are made to Campbell's original implementation in the
form of:
- Instead of accepting a user-supplied interpolation method,
RenderingHints#VALUE_INTERPOLATION_BICUBIC
interpolation is always used. This was done after A/B comparison testing with large images down-scaled to thumbnail sizes showed noticeable "blurring" when BILINEAR interpolation was used. Given that Campbell's algorithm is only used in QUALITY mode when down-scaling, it was determined that the user's expectation of a much less blurry picture would require that BICUBIC be the default interpolation in order to meet the QUALITY expectation. - After each iteration of the do-while loop that incrementally scales the
source image down, an explicit effort is made to call
BufferedImage#flush()
on the interim temporaryBufferedImage
instances created by the algorithm in an attempt to ensure a more complete GC cycle by the VM when cleaning up the temporary instances (this is in addition to disposing of the temporaryGraphics2D
references as well). - Extensive comments have been added to increase readability of the code.
- Variable names have been expanded to increase readability of the code.
BufferedImage#flush()
on any of the source images passed in by calling code; it is up to
the original caller to dispose of their source images when they are no longer
needed so the VM can most efficiently GC them.
Image Proportions
All scaling operations implemented by this class maintain the proportions of the original image unless a mode ofMode#FIT_EXACT
is specified; in
which case the orientation and proportion of the source image is ignored and
the image is stretched (if necessary) to fit the exact dimensions given.
When not using Mode#FIT_EXACT
, in order to maintain the
proportionality of the original images, this class implements the following
behavior:
- If the image is LANDSCAPE-oriented or SQUARE, treat the
targetWidth
as the primary dimension and re-calculate thetargetHeight
regardless of what is passed in. - If image is PORTRAIT-oriented, treat the
targetHeight
as the primary dimension and re-calculate thetargetWidth
regardless of what is passed in. - If a
Mode
value ofMode#FIT_TO_WIDTH
orMode#FIT_TO_HEIGHT
is passed in to theresize
method, the image's orientation is ignored and the scaled image is fit to the preferred dimension by using the value passed in by the user for that dimension and recalculating the other (regardless of image orientation). This is useful, for example, when working with PORTRAIT oriented images that you need to all be the same width or visa-versa (e.g. showing user profile pictures in a directory listing).
Optimized Image Handling
Java2D provides support for a number of different image types defined asBufferedImage.TYPE_*
variables, unfortunately not all image
types are supported equally in the Java2D rendering pipeline.
Some more obscure image types either have poor or no support, leading to
severely degraded quality and processing performance when an attempt is made
by imgscalr to create a scaled instance of the same type as the
source image. In many cases, especially when applying BufferedImageOp
s, using poorly supported image types can even lead to exceptions or total
corruption of the image (e.g. solid black image).
imgscalr specifically accounts for and automatically hands
ALL of these pain points for you internally by shuffling all
images into one of two types:
depending on if the source image utilizes transparency or not. This is a
recommended approach by the Java2D team for dealing with poorly (or non)
supported image types. More can be read about this issue here.
This is also the reason we recommend using
#apply(BufferedImage, BufferedImageOp...)
to apply your own ops to
images even if you aren't using imgscalr for anything else.
GIF Transparency
Unfortunately in Java 6 and earlier, support for GIF'sIndexColorModel
is sub-par, both in accurate color-selection and in
maintaining transparency when moving to an image of type
BufferedImage#TYPE_INT_ARGB
; because of this issue when a GIF image
is processed by imgscalr and the result saved as a GIF file (instead of PNG),
it is possible to lose the alpha channel of a transparent image or in the
case of applying an optional BufferedImageOp
, lose the entire picture
all together in the result (long standing JDK bugs are filed for all of these
issues).
imgscalr currently does nothing to work around this manually because it is a
defect in the native platform code itself. Fortunately it looks like the
issues are half-fixed in Java 7 and any manual workarounds we could attempt
internally are relatively expensive, in the form of hand-creating and setting
RGB values pixel-by-pixel with a custom ColorModel
in the scaled
image. This would lead to a very measurable negative impact on performance
without the caller understanding why.
Workaround: A workaround to this issue with all version of
Java is to simply save a GIF as a PNG; no change to your code needs to be
made except when the image is saved out, e.g. using ImageIO
.
When a file type of "PNG" is used, both the transparency and high color quality will be maintained as the PNG code path in Java2D is superior to the GIF implementation.
If the issue with optional BufferedImageOp
s destroying GIF image
content is ever fixed in the platform, saving out resulting images as GIFs
should suddenly start working.
More can be read about the issue here and here.
Thread Safety
TheScalr
class is thread-safe (as all the methods
are static
); this class maintains no internal state while
performing any of the provided operations and is safe to call simultaneously
from multiple threads.
Logging
This class implements all its debug logging via the#log(int, String, Object...)
method. At this time logging is done
directly to System.out
via the printf
method. This
allows the logging to be light weight and easy to capture (every imgscalr log
message is prefixed with the #LOG_PREFIX
string) while adding no
dependencies to the library.
Implementation of logging in this class is as efficient as possible; avoiding
any calls to the logger method or passing of arguments if logging is not
enabled to avoid the (hidden) cost of constructing the Object[] argument for
the varargs-based method call.
DEBUG_PROPERTY_NAME
String
System property name used to define the debug boolean flag.
Value is "imgscalr.debug
".
LOG_PREFIX_PROPERTY_NAME
String
System property name used to define a custom log prefix.
Value is "imgscalr.logPrefix
".
DEBUG
boolean
Flag used to indicate if debugging output has been enabled by setting the
"imgscalr.debug
" system property to true
. This
value will be false
if the "imgscalr.debug
"
system property is undefined or set to false
.
-Dimgscalr.debug=true
or by calling System#setProperty(String, String)
to set a
new property value for #DEBUG_PROPERTY_NAME
before this class is
loaded.
Default value is false
.
LOG_PREFIX
String
Prefix to every log message this library logs. Using a well-defined prefix helps make it easier both visually and programmatically to scan log files for messages produced by this library.
This property can be set on startup with:
-Dimgscalr.logPrefix=<YOUR PREFIX HERE>
or by calling System#setProperty(String, String)
to set a
new property value for #LOG_PREFIX_PROPERTY_NAME
before this
class is loaded.
Default value is "[imgscalr]
" (including the space).
OP_ANTIALIAS
ConvolveOp
A ConvolveOp
using a very light "blur" kernel that acts like an
anti-aliasing filter (softens the image a bit) when applied to an image.
AreaAveragingScaleFilter
(which is used internally by the
deprecated Image#getScaledInstance(int, int, int)
method in the
JDK that imgscalr is meant to replace).
This ConvolveOp uses a 3x3 kernel with the values:
.0f | .08f | .0f |
.08f | .68f | .08f |
.0f | .08f | .0f |
ConvolveOp#EDGE_NO_OP
instruction to not process the pixels along
the very edge of the image (otherwise EDGE_ZERO_FILL would create a
black-border around the image). If you have not worked with a ConvolveOp
before, it just means this default OP will "do the right thing" and not
give you garbage results.
This ConvolveOp uses no RenderingHints
values as internally the
ConvolveOp
class only uses hints when doing a color conversion
between the source and destination BufferedImage
targets.
imgscalr allows the ConvolveOp
to create its own destination
image every time, so no color conversion is ever needed and thus no
hints.
Performance
Use of this (and other)ConvolveOp
s are hardware accelerated when
possible. For more information on if your image op is hardware
accelerated or not, check the source code of the underlying JDK class
that actually executes the Op code, sun.awt.image.ImagingLib.
Known Issues
In all versions of Java (tested up to Java 7 preview Build 131), running this op against a GIF with transparency and attempting to save the resulting image as a GIF results in a corrupted/empty file. The file must be saved out as a PNG to maintain the transparency.OP_DARKER
RescaleOp
A RescaleOp
used to make any input image 10% darker.
OP_BRIGHTER
RescaleOp
A RescaleOp
used to make any input image 10% brighter.
OP_GRAYSCALE
ColorConvertOp
A ColorConvertOp
used to convert any image to a grayscale color
palette.
THRESHOLD_BALANCED_SPEED
int
Threshold (in pixels) at which point the scaling operation using the
Method#AUTOMATIC
method will decide if a Method#BALANCED
method will be used (if smaller than or equal to threshold) or a
Method#SPEED
method will be used (if larger than threshold).
Method#BALANCED
scale method to look decent in
most all cases while using the faster Method#SPEED
method for
images bigger than this threshold showed no noticeable degradation over a
BALANCED
scale.
THRESHOLD_QUALITY_BALANCED
int
Threshold (in pixels) at which point the scaling operation using the
Method#AUTOMATIC
method will decide if a Method#QUALITY
method will be used (if smaller than or equal to threshold) or a
Method#BALANCED
method will be used (if larger than threshold).
Method#QUALITY
scale method to look decent in
most all cases while using the faster Method#BALANCED
method for
images bigger than this threshold showed no noticeable degradation over a
QUALITY
scale.
Scalr
()
apply
(BufferedImage
src
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, BufferedImageOp
ops
)BufferedImage src |
The image that will have the ops applied to it. |
BufferedImageOp ops |
1 or more ops to apply to the image. |
BufferedImage |
a new |
IllegalArgumentException |
|
ImagingOpException |
Used to apply, in the order given, 1 or more BufferedImageOp
s to
a given BufferedImage
and return the result.
RasterFormatException
when applying a perfectly valid BufferedImageOp
s to images.
Feature: This implementation also works around
BufferedImageOp
s failing to apply and throwing
ImagingOpException
s when run against a src
image
type that is poorly supported. Unfortunately using ImageIO
and
standard Java methods to load images provides no consistency in getting
images in well-supported formats. This method automatically accounts and
corrects for all those problems (if necessary).
It is recommended you always use this method to apply any
BufferedImageOp
s instead of relying on directly using the
BufferedImageOp#filter(BufferedImage, BufferedImage)
method.
Performance: Not all BufferedImageOp
s are
hardware accelerated operations, but many of the most popular (like
ConvolveOp
) are. For more information on if your image op is
hardware accelerated or not, check the source code of the underlying JDK
class that actually executes the Op code, sun.awt.image.ImagingLib.
TIP: This operation leaves the original src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
crop
(BufferedImage
src
, int
width
, int
height
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, int
width
, int
height
, BufferedImageOp
ops
)BufferedImage src |
The image to crop. |
int width |
The width of the bounding cropping box. |
int height |
The height of the bounding cropping box. |
BufferedImageOp ops |
0 or more ops to apply to the image. If
null or empty then src is return
unmodified. |
BufferedImage |
a new |
IllegalArgumentException |
|
ImagingOpException |
Used to crop the given src
image from the top-left corner
and applying any optional BufferedImageOp
s to the result before
returning it.
src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
crop
(BufferedImage
src
, int
x
, int
y
, int
width
, int
height
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, int
x
, int
y
, int
width
, int
height
, BufferedImageOp
ops
)BufferedImage src |
The image to crop. |
int x |
The x-coordinate of the top-left corner of the bounding box used for cropping. |
int y |
The y-coordinate of the top-left corner of the bounding box used for cropping. |
int width |
The width of the bounding cropping box. |
int height |
The height of the bounding cropping box. |
BufferedImageOp ops |
0 or more ops to apply to the image. If
null or empty then src is return
unmodified. |
BufferedImage |
a new |
IllegalArgumentException |
|
ImagingOpException |
Used to crop the given src
image and apply any optional
BufferedImageOp
s to it before returning the result.
src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
pad
(BufferedImage
src
, int
padding
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, int
padding
, BufferedImageOp
ops
)BufferedImage src |
The image the padding will be added to. |
int padding |
The number of pixels of padding to add to each side in the
resulting image. If this value is |
BufferedImageOp ops |
0 or more ops to apply to the image. If
null or empty then src is return
unmodified. |
BufferedImage |
a new |
IllegalArgumentException |
|
ImagingOpException |
Used to apply padding around the edges of an image using
Color#BLACK
to fill the extra padded space and then return the
result.
padding
specified is applied to all sides;
more specifically, a padding
of 2
would add 2
extra pixels of space (filled by the given color
) on the
top, bottom, left and right sides of the resulting image causing the
result to be 4 pixels wider and 4 pixels taller than the src
image.
TIP: This operation leaves the original src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
pad
(BufferedImage
src
, int
padding
, Color
color
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, int
padding
, Color
color
, BufferedImageOp
ops
)BufferedImage src |
The image the padding will be added to. |
int padding |
The number of pixels of padding to add to each side in the
resulting image. If this value is |
Color color |
The color to fill the padded space with. |
BufferedImageOp ops |
0 or more ops to apply to the image. If
null or empty then src is return
unmodified. |
BufferedImage |
a new |
IllegalArgumentException |
|
ImagingOpException |
Used to apply padding around the edges of an image using the given color
to fill the extra padded space and then return the result. Color
s
using an alpha channel (i.e. transparency) are supported.
padding
specified is applied to all sides;
more specifically, a padding
of 2
would add 2
extra pixels of space (filled by the given color
) on the
top, bottom, left and right sides of the resulting image causing the
result to be 4 pixels wider and 4 pixels taller than the src
image.
TIP: This operation leaves the original src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
resize
(BufferedImage
src
, int
targetSize
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, int
targetSize
, BufferedImageOp
ops
)BufferedImage src |
The image that will be scaled. |
int targetSize |
The target width and height (square) that you wish the image to fit within. |
BufferedImageOp ops |
0 or more optional image operations (e.g.
sharpen, blur, etc.) that can be applied to the final result
before returning the image. |
BufferedImage |
a new |
IllegalArgumentException |
|
ImagingOpException |
Resize a given image (maintaining its original proportion) to a width and
height no bigger than targetSize
and apply the given
BufferedImageOp
s (if any) to the result before returning it.
Method#AUTOMATIC
and mode of
Mode#AUTOMATIC
are used.
TIP: This operation leaves the original src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
resize
(BufferedImage
src
, Method
scalingMethod
, int
targetSize
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, Method
scalingMethod
, int
targetSize
, BufferedImageOp
ops
)BufferedImage src |
The image that will be scaled. |
Method scalingMethod |
The method used for scaling the image; preferring speed to quality or a balance of both. |
int targetSize |
The target width and height (square) that you wish the image to fit within. |
BufferedImageOp ops |
0 or more optional image operations (e.g.
sharpen, blur, etc.) that can be applied to the final result
before returning the image. |
BufferedImage |
a new |
IllegalArgumentException |
|
ImagingOpException |
Resize a given image (maintaining its original proportion) to a width and
height no bigger than targetSize
using the given scaling
method and apply the given BufferedImageOp
s (if any) to the
result before returning it.
Mode#AUTOMATIC
is used.
TIP: This operation leaves the original src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
resize
(BufferedImage
src
, Mode
resizeMode
, int
targetSize
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, Mode
resizeMode
, int
targetSize
, BufferedImageOp
ops
)BufferedImage src |
The image that will be scaled. |
Mode resizeMode |
Used to indicate how imgscalr should calculate the final
target size for the image, either fitting the image to the
given width ( |
int targetSize |
The target width and height (square) that you wish the image to fit within. |
BufferedImageOp ops |
0 or more optional image operations (e.g.
sharpen, blur, etc.) that can be applied to the final result
before returning the image. |
BufferedImage |
a new |
IllegalArgumentException |
|
ImagingOpException |
Resize a given image (maintaining its original proportion) to a width and
height no bigger than targetSize
(or fitting the image to
the given WIDTH or HEIGHT explicitly, depending on the Mode
specified) and apply the given BufferedImageOp
s (if any) to the
result before returning it.
Method#AUTOMATIC
is used.
TIP: This operation leaves the original src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
resize
(BufferedImage
src
, Method
scalingMethod
, Mode
resizeMode
, int
targetSize
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, Method
scalingMethod
, Mode
resizeMode
, int
targetSize
, BufferedImageOp
ops
)BufferedImage src |
The image that will be scaled. |
Method scalingMethod |
The method used for scaling the image; preferring speed to quality or a balance of both. |
Mode resizeMode |
Used to indicate how imgscalr should calculate the final
target size for the image, either fitting the image to the
given width ( |
int targetSize |
The target width and height (square) that you wish the image to fit within. |
BufferedImageOp ops |
0 or more optional image operations (e.g.
sharpen, blur, etc.) that can be applied to the final result
before returning the image. |
BufferedImage |
a new |
IllegalArgumentException |
|
ImagingOpException |
Resize a given image (maintaining its original proportion) to a width and
height no bigger than targetSize
(or fitting the image to
the given WIDTH or HEIGHT explicitly, depending on the Mode
specified) using the given scaling method and apply the given
BufferedImageOp
s (if any) to the result before returning it.
src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
resize
(BufferedImage
src
, int
targetWidth
, int
targetHeight
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, int
targetWidth
, int
targetHeight
, BufferedImageOp
ops
)BufferedImage src |
The image that will be scaled. |
int targetWidth |
The target width that you wish the image to have. |
int targetHeight |
The target height that you wish the image to have. |
BufferedImageOp ops |
0 or more optional image operations (e.g.
sharpen, blur, etc.) that can be applied to the final result
before returning the image. |
BufferedImage |
a new |
IllegalArgumentException |
|
ImagingOpException |
Resize a given image (maintaining its original proportion) to the target
width and height and apply the given BufferedImageOp
s (if any) to
the result before returning it.
Method#AUTOMATIC
and mode of
Mode#AUTOMATIC
are used.
TIP: See the class description to understand how this
class handles recalculation of the targetWidth
or
targetHeight
depending on the image's orientation in order
to maintain the original proportion.
TIP: This operation leaves the original src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
resize
(BufferedImage
src
, Method
scalingMethod
, int
targetWidth
, int
targetHeight
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, Method
scalingMethod
, int
targetWidth
, int
targetHeight
, BufferedImageOp
ops
)BufferedImage src |
The image that will be scaled. |
Method scalingMethod |
The method used for scaling the image; preferring speed to quality or a balance of both. |
int targetWidth |
The target width that you wish the image to have. |
int targetHeight |
The target height that you wish the image to have. |
BufferedImageOp ops |
0 or more optional image operations (e.g.
sharpen, blur, etc.) that can be applied to the final result
before returning the image. |
BufferedImage |
a new |
Resize a given image (maintaining its original proportion) to the target
width and height using the given scaling method and apply the given
BufferedImageOp
s (if any) to the result before returning it.
Mode#AUTOMATIC
is used.
TIP: See the class description to understand how this
class handles recalculation of the targetWidth
or
targetHeight
depending on the image's orientation in order
to maintain the original proportion.
TIP: This operation leaves the original src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
resize
(BufferedImage
src
, Mode
resizeMode
, int
targetWidth
, int
targetHeight
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, Mode
resizeMode
, int
targetWidth
, int
targetHeight
, BufferedImageOp
ops
)BufferedImage src |
The image that will be scaled. |
Mode resizeMode |
Used to indicate how imgscalr should calculate the final
target size for the image, either fitting the image to the
given width ( |
int targetWidth |
The target width that you wish the image to have. |
int targetHeight |
The target height that you wish the image to have. |
BufferedImageOp ops |
0 or more optional image operations (e.g.
sharpen, blur, etc.) that can be applied to the final result
before returning the image. |
BufferedImage |
a new |
IllegalArgumentException |
|
ImagingOpException |
Resize a given image (maintaining its original proportion) to the target
width and height (or fitting the image to the given WIDTH or HEIGHT
explicitly, depending on the Mode
specified) and apply the given
BufferedImageOp
s (if any) to the result before returning it.
Method#AUTOMATIC
is used.
TIP: See the class description to understand how this
class handles recalculation of the targetWidth
or
targetHeight
depending on the image's orientation in order
to maintain the original proportion.
TIP: This operation leaves the original src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
resize
(BufferedImage
src
, Method
scalingMethod
, Mode
resizeMode
, int
targetWidth
, int
targetHeight
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, Method
scalingMethod
, Mode
resizeMode
, int
targetWidth
, int
targetHeight
, BufferedImageOp
ops
)BufferedImage src |
The image that will be scaled. |
Method scalingMethod |
The method used for scaling the image; preferring speed to quality or a balance of both. |
Mode resizeMode |
Used to indicate how imgscalr should calculate the final
target size for the image, either fitting the image to the
given width ( |
int targetWidth |
The target width that you wish the image to have. |
int targetHeight |
The target height that you wish the image to have. |
BufferedImageOp ops |
0 or more optional image operations (e.g.
sharpen, blur, etc.) that can be applied to the final result
before returning the image. |
BufferedImage |
a new |
IllegalArgumentException |
|
ImagingOpException |
Resize a given image (maintaining its original proportion) to the target
width and height (or fitting the image to the given WIDTH or HEIGHT
explicitly, depending on the Mode
specified) using the given
scaling method and apply the given BufferedImageOp
s (if any) to
the result before returning it.
targetWidth
or
targetHeight
depending on the image's orientation in order
to maintain the original proportion.
TIP: This operation leaves the original src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
rotate
(BufferedImage
src
, Rotation
rotation
, BufferedImageOp
ops
)
BufferedImage
BufferedImage
src
, Rotation
rotation
, BufferedImageOp
ops
)BufferedImage src |
The image that will have the rotation applied to it. |
Rotation rotation |
The rotation that will be applied to the image. |
BufferedImageOp ops |
Zero or more optional image operations (e.g. sharpen, blur, etc.) that can be applied to the final result before returning the image. |
BufferedImage |
a new |
IllegalArgumentException |
|
ImagingOpException |
Used to apply a Rotation
and then 0
or more
BufferedImageOp
s to a given image and return the result.
src
image unmodified. If the caller is done with the src
image
after getting the result of this operation, remember to call
BufferedImage#flush()
on the src
to free up native
resources and make it easier for the GC to collect the unused image.
log
(int
depth
, String
message
, Object
params
)
void
int
depth
, String
message
, Object
params
)int depth |
The indentation level of the log message. |
String message |
The log message in format string syntax that will be logged. |
Object params |
The parameters that will be swapped into all the place holders in the original messages before being logged. |
Used to write out a useful and well-formatted log message by any piece of code inside of the imgscalr library.
If a message cannot be logged (logging is disabled) then this method returns immediately. NOTE: Because Java will auto-box primitive arguments into Objects when building out theparams
array, care should
be taken not to call this method with primitive values unless
Scalr#DEBUG
is true
; otherwise the VM will be
spending time performing unnecessary auto-boxing calculations.
createOptimalImage
(BufferedImage
src
)
BufferedImage
BufferedImage
src
)BufferedImage src |
The source image that will be analyzed to determine the most optimal image type it can be rendered into. |
BufferedImage |
a new |
Used to create a BufferedImage
with the most optimal RGB TYPE (
BufferedImage#TYPE_INT_RGB
or BufferedImage#TYPE_INT_ARGB
) capable of being rendered into from the given src
. The
width and height of both images will be identical.
src
into
the result image; see #copyToOptimalImage(BufferedImage)
for
that.
We force all rendering results into one of these two types, avoiding the
case where a source image is of an unsupported (or poorly supported)
format by Java2D causing the rendering result to end up looking terrible
(common with GIFs) or be totally corrupt (e.g. solid black image).
Originally reported by Magnus Kvalheim from Movellas when scaling certain
GIF and PNG images.
createOptimalImage
(BufferedImage
src
, int
width
, int
height
)
BufferedImage
BufferedImage
src
, int
width
, int
height
)BufferedImage src |
The source image that will be analyzed to determine the most optimal image type it can be rendered into. |
int width |
The width of the newly created resulting image. |
int height |
The height of the newly created resulting image. |
BufferedImage |
a new |
IllegalArgumentException |
Used to create a BufferedImage
with the given dimensions and the
most optimal RGB TYPE ( BufferedImage#TYPE_INT_RGB
or
BufferedImage#TYPE_INT_ARGB
) capable of being rendered into from
the given src
.
src
into
the result image; see #copyToOptimalImage(BufferedImage)
for
that.
We force all rendering results into one of these two types, avoiding the
case where a source image is of an unsupported (or poorly supported)
format by Java2D causing the rendering result to end up looking terrible
(common with GIFs) or be totally corrupt (e.g. solid black image).
Originally reported by Magnus Kvalheim from Movellas when scaling certain
GIF and PNG images.
copyToOptimalImage
(BufferedImage
src
)
BufferedImage
BufferedImage
src
)BufferedImage src |
The image to copy (if necessary) into an optimally typed
|
BufferedImage |
a representation of the |
IllegalArgumentException |
Used to copy a BufferedImage
from a non-optimal type into a new
BufferedImage
instance of an optimal type (RGB or ARGB). If
src
is already of an optimal type, then it is returned
unmodified.
BufferedImage#TYPE_INT_RGB
or BufferedImage#TYPE_INT_ARGB
) in order to ensure all subsequent graphics operations are performed as
efficiently and correctly as possible.
When using Java2D to work with image types that are not well supported,
the results can be anything from exceptions bubbling up from the depths
of Java2D to images being completely corrupted and just returned as solid
black.
determineScalingMethod
(int
targetWidth
, int
targetHeight
, float
ratio
)
Method
int
targetWidth
, int
targetHeight
, float
ratio
)int targetWidth |
The target width for the scaled image. |
int targetHeight |
The target height for the scaled image. |
float ratio |
A height/width ratio used to determine the orientation of the image so the primary dimension (width or height) can be selected to test if it is greater than or less than a particular threshold. |
Method |
the fastest |
Used to determine the scaling Method
that is best suited for
scaling the image to the targeted dimensions.
Method
when a Method#AUTOMATIC
method is specified. This
method utilizes the Scalr#THRESHOLD_QUALITY_BALANCED
and
Scalr#THRESHOLD_BALANCED_SPEED
thresholds when selecting which
method should be used by comparing the primary dimension (width or
height) against the threshold and seeing where the image falls. The
primary dimension is determined by looking at the orientation of the
image: landscape or square images use their width and portrait-oriented
images use their height.
scaleImage
(BufferedImage
src
, int
targetWidth
, int
targetHeight
, Object
interpolationHintValue
)
BufferedImage
BufferedImage
src
, int
targetWidth
, int
targetHeight
, Object
interpolationHintValue
)BufferedImage src |
The image that will be scaled. |
int targetWidth |
The target width for the scaled image. |
int targetHeight |
The target height for the scaled image. |
Object interpolationHintValue |
The |
BufferedImage |
the result of scaling the original |
Used to implement a straight-forward image-scaling operation using Java 2D.
This method uses the Oracle-encouraged method ofGraphics2D.drawImage(...)
to scale the given image with the
given interpolation hint.
scaleImageIncrementally
(BufferedImage
src
, int
targetWidth
, int
targetHeight
, Method
scalingMethod
, Object
interpolationHintValue
)
BufferedImage
BufferedImage
src
, int
targetWidth
, int
targetHeight
, Method
scalingMethod
, Object
interpolationHintValue
)BufferedImage src |
The image that will be scaled. |
int targetWidth |
The target width for the scaled image. |
int targetHeight |
The target height for the scaled image. |
Method scalingMethod |
The scaling method specified by the user (or calculated by imgscalr) to use for this incremental scaling operation. |
Object interpolationHintValue |
The |
BufferedImage |
an image scaled to the given dimensions using the given rendering hint. |
Used to implement Chris Campbell's incremental-scaling algorithm: http://today.java.net/pub/a/today/2007/04/03/perils -of-image-getscaledinstance.html.
Modifications to the original algorithm are variable names and comments added for clarity and the hard-coding of using BICUBIC interpolation as well as the explicit "flush()" operation on the interim BufferedImage instances to avoid resource leaking.