📄 cmsimagescaler.java
字号:
result.append(filter);
if (i.hasNext()) {
result.append(':');
}
}
return result.toString();
}
/**
* Returns the height.<p>
*
* @return the height
*/
public int getHeight() {
return m_height;
}
/**
* Returns the image type from the given file name based on the file suffix (extension)
* and the available image writers.<p>
*
* For example, for the file name "opencms.gif" the type is GIF, for
* "opencms.jpg" is is "JPEG" etc.<p>
*
* In case the input filename has no suffix, or there is no known image writer for the format defined
* by the suffix, <code>null</code> is returned.<p>
*
* Any non-null result can be used if an image type input value is required.<p>
*
* @param filename the file name to get the type for
*
* @return the image type from the given file name based on the suffix and the available image writers,
* or null if no image writer is available for the format
*/
public String getImageType(String filename) {
return Simapi.getImageType(filename);
}
/**
* Returns the maximum image size (width * height) to apply image blurring when downscaling images.<p>
*
* Image blurring is required to achive the best results for downscale operatios when the target image size
* is 2 times or more smaller then the original image size. This parameter controls the maximum size (width * height) of an
* image that is blurred before it is downscaled. If the image is larger, no blurring is done.
* However, image blurring is an expensive operation in both CPU usage and memory consumption.
* Setting the blur size to large may case "out of memory" errors.<p>
*
* @return the maximum image size (width * height) to apply image blurring when downscaling images
*/
public int getMaxBlurSize() {
return m_maxBlurSize;
}
/**
* Returns the image pixel count, that is the image with multiplied by the image height.<p>
*
* If this scalier is not valid (see {@link #isValid()}) the result is undefined.<p>
*
* @return the image pixel count, that is the image with multiplied by the image height
*/
public int getPixelCount() {
return m_width * m_height;
}
/**
* Returns the position.<p>
*
* @return the position
*/
public int getPosition() {
return m_position;
}
/**
* Returns the image saving quality in percent (0 - 100).<p>
*
* This is used oly if applicable, for example when saving JPEG images.<p>
*
* @return the image saving quality in percent
*/
public int getQuality() {
return m_quality;
}
/**
* Returns the image rendering mode constant.<p>
*
* Possible values are:<dl>
* <dt>{@link Simapi#RENDER_QUALITY} (default)</dt>
* <dd>Use best possible image processing - this may be slow sometimes.</dd>
*
* <dt>{@link Simapi#RENDER_SPEED}</dt>
* <dd>Fastest image processing but worse results - use this for thumbnails or where speed is more important then quality.</dd>
*
* <dt>{@link Simapi#RENDER_MEDIUM}</dt>
* <dd>Use default rendering hints from JVM - not recommended since it's almost as slow as the {@link Simapi#RENDER_QUALITY} mode.</dd></dl>
*
* @return the image rendering mode constant
*/
public int getRenderMode() {
return m_renderMode;
}
/**
* Returns a new image scaler that is a rescaler from the <code>this</code> scaler
* size to the given target scaler size.<p>
*
* The height of the target image is calculated in proportion
* to the original image width. If the width of the the original image is not known,
* the target image width is calculated in proportion to the original image height.<p>
*
* @param target the image scaler that holds the target image dimensions
*
* @return a new image scaler that is a rescale from the <code>this</code> scaler
* size to the given target scaler size.<p>
*/
public CmsImageScaler getReScaler(CmsImageScaler target) {
int height = target.getHeight();
int width = target.getWidth();
if ((width > 0) && (getWidth() > 0)) {
// width is known, calculate height
float scale = (float)width / (float)getWidth();
height = Math.round(getHeight() * scale);
} else if ((height > 0) && (getHeight() > 0)) {
// height is known, calculate width
float scale = (float)height / (float)getHeight();
width = Math.round(getWidth() * scale);
} else if (isValid() && !target.isValid()) {
// scaler is not valid but original is, so use original size of image
width = getWidth();
height = getHeight();
}
if ((target.getType() == 1) && (!target.isValid())) {
// "no upscale" has been requested, only one target dimension was given
if ((target.getWidth() > 0) && (getWidth() < width)) {
// target width was given, target image should have this width
height = getHeight();
} else if ((target.getHeight() > 0) && (getHeight() < height)) {
// target height was given, target image should have this height
width = getWidth();
}
}
// now create and initialize the result scaler
return new CmsImageScaler(target, width, height);
}
/**
* Returns the type.<p>
*
* Possible values are:<dl>
*
* <dt>0 (default): Scale to exact target size with background padding</dt><dd><ul>
* <li>enlarge image to fit in target size (if required)
* <li>reduce image to fit in target size (if required)
* <li>keep image aspect ratio / propotions intact
* <li>fill up with bgcolor to reach exact target size
* <li>fit full image inside target size (only applies if reduced)</ul></dd>
*
* <dt>1: Thumbnail generation mode (like 0 but no image enlargement)</dt><dd><ul>
* <li>dont't enlarge image
* <li>reduce image to fit in target size (if required)
* <li>keep image aspect ratio / propotions intact
* <li>fill up with bgcolor to reach exact target size
* <li>fit full image inside target size (only applies if reduced)</ul></dd>
*
* <dt>2: Scale to exact target size, crop what does not fit</dt><dd><ul>
* <li>enlarge image to fit in target size (if required)
* <li>reduce image to fit in target size (if required)
* <li>keep image aspect ratio / propotions intact
* <li>fit full image inside target size (crop what does not fit)</ul></dd>
*
* <dt>3: Scale and keep image propotions, target size variable</dt><dd><ul>
* <li>enlarge image to fit in target size (if required)
* <li>reduce image to fit in target size (if required)
* <li>keep image aspect ratio / propotions intact
* <li>scaled image will not be padded or cropped, so target size is likley not the exact requested size</ul></dd>
*
* <dt>4: Don't keep image propotions, use exact target size</dt><dd><ul>
* <li>enlarge image to fit in target size (if required)
* <li>reduce image to fit in target size (if required)
* <li>don't keep image aspect ratio / propotions intact
* <li>the image will be scaled exactly to the given target size and likley will be loose proportions</ul></dd>
* </dl>
*
* @return the type
*/
public int getType() {
return m_type;
}
/**
* Returns the width.<p>
*
* @return the width
*/
public int getWidth() {
return m_width;
}
/**
* Returns a new image scaler that is a width based downscale from the size of <code>this</code> scaler
* to the given scaler size.<p>
*
* If no downscale from this to the given scaler is required because the width of <code>this</code>
* scaler is not larger than the target width, then the image dimensions of <code>this</code> scaler
* are unchanged in the result scaler. No upscaling is done!<p>
*
* @param downScaler the image scaler that holds the downscaled target image dimensions
*
* @return a new image scaler that is a downscale from the size of <code>this</code> scaler
* to the given target scaler size
*/
public CmsImageScaler getWidthScaler(CmsImageScaler downScaler) {
int width = downScaler.getWidth();
int height;
if (getWidth() > width) {
// width is too large, re-calculate height
float scale = (float)width / (float)getWidth();
height = Math.round(getHeight() * scale);
} else {
// width is ok
width = getWidth();
height = getHeight();
}
// now create and initialize the result scaler
return new CmsImageScaler(downScaler, width, height);
}
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return toString().hashCode();
}
/**
* Returns <code>true</code> if this image scaler must be downscaled when compared to the
* given "downscale" image scaler.<p>
*
* If either <code>this</code> scaler or the given <code>downScaler</code> is invalid according to
* {@link #isValid()}, then <code>false</code> is returned.<p>
*
* The use case: <code>this</code> scaler represents an image (that is contains width and height of
* an image). The <code>downScaler</code> represents the maximum wanted image. The scalers
* are compared and if the image represented by <code>this</code> scaler is too large,
* <code>true</code> is returned. Image orientation is ignored, so for example an image with 600x800 pixel
* will NOT be downscaled if the target size is 800x600 but kept unchanged.<p>
*
* @param downScaler the downscaler to compare this image scaler with
*
* @return <code>true</code> if this image scaler must be downscaled when compared to the
* given "downscale" image scaler
*/
public boolean isDownScaleRequired(CmsImageScaler downScaler) {
if ((downScaler == null) || !isValid() || !downScaler.isValid()) {
// one of the scalers is invalid
return false;
}
if (getPixelCount() < (downScaler.getPixelCount() / 2)) {
// the image has much less pixels then the target, so don't downscale
return false;
}
int downWidth = downScaler.getWidth();
int downHeight = downScaler.getHeight();
if (downHeight > downWidth) {
// normalize image orientation - the width should always be the large side
downWidth = downHeight;
downHeight = downScaler.getWidth();
}
int height = getHeight();
int width = getWidth();
if (height > width) {
// normalize image orientation - the width should always be the large side
width = height;
height = getWidth();
}
return (width > downWidth) || (height > downHeight);
}
/**
* Returns <code>true</code> if all required parameters are available.<p>
*
* Required parameters are "h" (height), and "w" (width).<p>
*
* @return <code>true</code> if all required parameters are available
*/
public boolean isValid() {
return (m_width > 0) && (m_height > 0);
}
/**
* Returns a scaled version of the given image byte content according this image scalers parameters.<p>
*
* @param content the image byte content to scale
* @param rootPath the root path of the image file in the VFS
*
* @return a scaled version of the given image byte content according to the provided scaler parameters
*/
public byte[] scaleImage(byte[] content, String rootPath) {
byte[] result = content;
RenderSettings renderSettings;
if ((m_renderMode == 0) && (m_quality == 0)) {
// use default render mode and quality
renderSettings = new RenderSettings(Simapi.RENDER_QUALITY);
} else {
// use special render mode and/or quality
renderSettings = new RenderSettings(m_renderMode);
if (m_quality != 0) {
renderSettings.setCompressionQuality(m_quality / 100f);
}
}
// set max blur siuze
renderSettings.setMaximumBlurSize(m_maxBlurSize);
// new create the scaler
Simapi scaler = new Simapi(renderSettings);
// calculate a valid image type supported by the imaging libary (e.g. "JPEG", "GIF")
String imageType = Simapi.getImageType(rootPath);
if (imageType == null) {
// no type given, maybe the name got mixed up
String mimeType = OpenCms.getResourceManager().getMimeType(rootPath, null, null);
// check if this is another known mime type, if so DONT use it (images should not be named *.pdf)
if (mimeType == null) {
// no mime type found, use JPEG format to write images to the cache
imageType = Simapi.TYPE_JPEG;
}
}
if (imageType == null) {
// unknown type, unable to scale the image
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.ERR_UNABLE_TO_SCALE_IMAGE_2, rootPath, toString()));
}
return result;
}
try {
BufferedImage image = Simapi.read(content);
Color color = getColor();
if (!m_filters.isEmpty()) {
Iterator i = m_filters.iterator();
while (i.hasNext()) {
String filter = (String)i.next();
if (FILTER_GRAYSCALE.equals(filter)) {
// add a grayscale filter
GrayscaleFilter grayscaleFilter = new GrayscaleFilter();
renderSettings.addImageFilter(grayscaleFilter);
} else if (FILTER_SHADOW.equals(filter)) {
// add a drop shadow filter
ShadowFilter shadowFilter = new ShadowFilter();
shadowFilter.setXOffset(5);
shadowFilter.setYOffset(5);
shadowFilter.setOpacity(192);
shadowFilter.setBackgroundColor(color.getRGB());
color = Simapi.COLOR_TRANSPARENT;
renderSettings.setTransparentReplaceColor(Simapi.COLOR_TRANSPARENT);
renderSettings.addImageFilter(shadowFilter);
}
}
}
switch (getType()) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -