2016-09-20 16 views
1

我需要渲染位圖圖像(在我的PC上),旨在顯示在具有極其有限的調色板的設備上(例如,由RED( 0xFF0000),DARK_RED(0x880000),灰色等)。我只需要渲染2D幾何對象 - 文本,點,線,多邊形和弧。我想使用抗鋸齒(雖然由於有限的調色板本身可能非常有限)。我希望在將其保存爲屏幕之前將其顯示在屏幕上,例如將PNG傳輸到目標設備。使用有限的調色板渲染目標爲設備的2D圖像

假設我從一個從BufferedImage獲得的GraphicsD obj開始,那麼基本方法是什麼?我知道如何在AWT框架上顯示圖像,以及如何使用ImageIO保存圖像,但不清楚如何使用特定調色板渲染圖形。

選項春記有:

  1. 使用Graphics2D的API渲染它在全24位色彩,並啓用抗鋸齒。後處理將每種顏色映射到目標調色板中最近的鄰居。

  2. 說服Graphics2D使用目標調色板(IndexColorModel?)。通過Graphics2D API進行渲染。

  3. 寫我自己的圖元渲染線條,形狀等

選項3,我並不熱衷。選項1是可行的,但我不禁覺得如果反對目標調色板的話,反鋸齒效果會更好。這可能只是偏執狂。

選項2對我來說不清楚,也許不可能。

想法?

+0

這可能是一個愚蠢的問題,但如果您使用的是Graphics2D,您可以不選擇使用已知調色板之外的顏色進行繪製嗎?或者,它可能會使用調色板之外的顏色,而您擔心的反鋸齒?只有16種顏色,抗鋸齒可能看起來不太好。 – NESPowerGlove

+0

我想根據目標調色板使用抗鋸齒渲染最終圖像。所以,例如,RED對象的邊緣將會有一些DARK_RED像素(假設黑色背景)。 –

+0

正常渲染,然後將圖像轉換爲目標調色板,例如,使用顏色抖動(最有可能優化了有限的調色板),請參閱相關的[將BMP圖像轉換爲繪圖儀指令集?](http://stackoverflow.com/ a/36820654/2521214) – Spektre

回答

1

該解決方案似乎非常簡單。首先創建一個包含目標設備上可用顏色的IndexColorModel。然後創建一個BufferedImage,指定TYPE_BYTE_INDEXED,並提供IndexColorModel。然後啓用抗鋸齒:

BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_INDEXED, indexColorModel); 
Graphics2D gfx2d = image.createGraphics(); 
gfx2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, VALUE_ANTIALIAS_ON); 
gfx2d.setColor(Color.WHITE); 
gfx2d.drawLine(10, 10, 100, 160); 

的Graphics2D的渲染圖元將應用於僅使用顏色在IndexColorModel的抗混疊,即,目標設備的顏色。

+0

不錯。不要忘記接受你自己的答案。 – NESPowerGlove