簡體   English   中英

如何獲取java.awt.Image的ColorSpace?

[英]How to get ColorSpace of java.awt.Image?

我知道當我使用BufferedImage可以調用BufferedImage.getColorModel()但是當我只有java.awt.Image實例時如何獲得相同的值?

================================================== =================================

更新..

好吧。 現在讓我確切地解釋我想要實現的目標:

我想創建一種創建圖像縮略圖的方法。

首先,我將其轉換為JPEG文件格式的圖像並將結果寫入文件,然后發現如果這樣做,我將失去原始圖像的透明度,因此我嘗試將目標圖像另存為PNG文件格式,將BufferedImage標記為TYPE_BYTE_INDEXED以減小目標文件大小的大小,但是最后我意識到,如果現在原始圖像本身包含很多顏色,那么我將獲得質量較粗糙的目標圖像,因為TYPE_BYTE_INDEXED不能包含很多顏色。

所以,..現在我需要做一些研究,看看是否可以從所獲取的Image獲取imageType 如果imageType最初是TYPE_BYTE_INDEXED那么我也可以在目標圖像上使用TYPE_BYTE_INDEXED ,否則我可以使用TYPE_BYTE_ARGBTYPE_BYTE_RGB (取決於原始圖像的原始值)來確保我將獲得高質量的縮略圖和較小的尺寸圖像目標文件。

最好的選擇是使用返回RenderedImage的API獲取圖像(可以查詢其ColorModel)。 由於java.awt.Image不提供任何查詢其ColorModel的方法,因此任何猜謎游戲都將涉及檢查具體的實現類-可能與實現有關。

如果只想轉換為特定的ColorModel,請忽略圖像使用的ColorModel。 創建所需類型(和大小)的BufferedImage,獲取Graphics2D渲染到其中,然后將圖像繪制到緩沖的圖像中。

編輯:響應“創建縮略圖”

首先, 即使原始圖像是使用一個索引顏色模型,你仍然需要使用直接顏色模型的縮略圖-縮放索引彩色圖像會產生混合色(由於象素平均)是最有可能包含在原始顏色圖。 如果您真的想加倍努力,則必須分析縮略圖的像素數據,以決定是否可以使用索引顏色模型。

有一種半可靠的方法來確定源圖像是否具有Alpha通道:

/**
 * Returns true if image has alpha channel
 */
public static boolean hasAlpha(final Image image) {
    // If buffered image, the color model is readily available
    if (image instanceof RenderedImage) {
        return ((RenderedImage) image).getColorModel().hasAlpha();
    }
    // Use a pixel grabber to retrieve the image's color model;
    // grabbing a single pixel is usually sufficient
    final PixelGrabber pixelGrabber = new PixelGrabber(image, 0, 0, 1, 1, false);
    try {
        pixelGrabber.grabPixels();
        return pixelGrabber.getColorModel().hasAlpha();
    } catch (final Exception e) {
        return true;
    }
}

這可能會因圖像類型不清晰而失敗,但是對於生成縮略圖通常足夠好了。 確定是否存在Alpha后,只需為縮略圖TYPE_INT_ARGB或TYPE_INT_RGB選擇一個合適的BufferedImage.TYPE。

然后將圖像渲染為縮略圖圖像(這是一個冗長的示例):

    final boolean hasAlpha = hasAlpha(image);
    final int imageType =  hasAlpha ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB;
    final BufferedImage thumbnail = new BufferedImage(width, height, imageType);
    final Graphics2D g = thumbnail.createGraphics();
// set rendering hints according to desired quality
    g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    if (!hasAlpha) {
        g.drawImage(image, 0, 0, width, height, Color.WHITE, (ImageObserver) null);
    } else {
        g.drawImage(image, 0, 0, width, height, (ImageObserver) null);
    }
    g.dispose();

留給讀者練習是為縮略圖計算正確的寬度和高度。 然后可以使用ImageIO支持的任何格式的ImageIO保存縮略圖。

BufferdImage知道該方法是什么,但是如果可以在BufferdImage上使用此方法, BufferdImage嘗試將java.awt.Image轉換為BufferedImage

protected static BufferedImage toBufferedImage(Image image) {

        if (image instanceof BufferedImage) {
            return (BufferedImage) image;
        } else {

            int w = image.getWidth(null);
            int h = image.getHeight(null);

            BufferedImage bi = new BufferedImage(w, h,
                    BufferedImage.TYPE_INT_RGB);

            Graphics graphics = bi.getGraphics();
            graphics.drawImage(image, 0, 0, w, h, Color.WHITE, null);
            graphics.dispose();

            return bi;
        }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM