2016-09-20 1 views
1

J'ai besoin de rendre une image bitmap (sur mon PC), destinée à être affichée sur un périphérique avec une palette de couleurs extrêmement limitée (par exemple 16 couleurs rouges (0xFF0000), DARK_RED (0x880000), GRIS etc.). J'ai seulement besoin de rendre des objets géométriques 2D - du texte, des points, des lignes, des polygones et des arcs. Je veux utiliser l'anti-aliasing (mais en raison de la palette limitée, cela peut être très limité). Je voudrais l'afficher sur l'écran avant de l'enregistrer comme dire PNG à transférer sur l'appareil cible.Rendu d'une image 2D ciblée pour un périphérique avec une palette de couleurs limitée

Quelle est l'approche de base, en supposant que je commence avec un obj GraphicsD obtenu à partir d'un BufferedImage? Je sais comment afficher l'image sur un cadre AWT et comment l'enregistrer avec ImageIO, mais je suis moins clair sur le rendu des formes avec une palette spécifique en tête.

Les options qui viennent à l'esprit sont:

  1. Render en couleur 24 bits en utilisant l'API Graphics2D et avec anti-aliasing activé. Post-traitement pour mapper chaque couleur à son voisin le plus proche dans la palette cible.

  2. Convaincre Graphics2D d'utiliser la palette cible (IndexColorModel?). Rendre via l'API Graphics2D.

  3. écrire mes propres primitives pour le rendu des lignes, des formes, etc.

Option 3 Je ne suis pas vif sur. L'option 1 est faisable, mais je ne peux m'empêcher de penser que l'anti-crénelage fonctionnerait mieux s'il le faisait contre la palette cible. Cela peut être juste de la paranoïa.

L'option 2 n'est pas claire pour moi, peut-être pas possible.

Des idées?

+0

Cela peut être une question idiote, mais si vous utilisez Graphics2D, pourriez-vous simplement ne jamais choisir de dessiner avec une couleur en dehors de votre palette connue? Ou est-ce l'anti-aliasing qui peut utiliser des couleurs en dehors de votre palette qui vous inquiètent? Avec seulement 16 couleurs, l'anti-aliasing peut ne pas être esthétique. – NESPowerGlove

+0

Je souhaite que l'image finale soit rendue avec l'anti-aliasing basé sur la palette cible. Ainsi, par exemple, les bords d'un objet RED auront quelques pixels DARK_RED (en supposant un arrière-plan NOIR). –

+0

Rendu normalement puis convertir l'image en palette cible par exemple avec le tramage de couleur (pour lequel la palette limitée est probablement optimisée) voir en relation [Conversion de l'image BMP en jeu d'instructions pour un traceur?] (Http://stackoverflow.com/ a/36820654/2521214) – Spektre

Répondre

1

La solution semble être assez simple. Créez d'abord un IndexColorModel qui contient les couleurs disponibles sur le périphérique cible. Créez ensuite une image buffered, en spécifiant TYPE_BYTE_INDEXED et fournissez le IndexColorModel. Et puis activer l'anti-aliasing:

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); 

Les primitives de rendu Graphics2D s'appliqueront anti-aliasing en utilisant uniquement les couleurs du IndexColorModel, à savoir les couleurs de l'appareil cible.

+0

Nice. N'oublie pas d'accepter ta propre réponse. – NESPowerGlove