2010-12-14 30 views
4

Je suis mise à jour un plugin pour Paint.net que j'ai fait il y a quelques mois, il s'appelle Simulate Color Depth et réduit le nombre de couleurs de l'image au BPP choisi et depuis longtemps il a eu Dithering inclus mais jamais commandé Dithering et je pensais que ce serait un ajout intéressant d'avoir cela dans donc j'ai commencé à chercher sur Internet pour quelque chose d'utile, je me suis retrouvé sur cette page wiki ici http://en.wikipedia.org/wiki/Ordered_dithering, et j'ai essayé de faire comme écrit dans le pseudo CodeBayer commandé Dithering

for (int y = 0; x < image.Height; y++) 
{ 
    for (int x = 0; x < image.Width; x++) 
    { 
     Color color = image.GetPixel(x, y); 
     color.R = color.R + bayer8x8[x % 8, y % 8]; 
     color.G = color.G + bayer8x8[x % 8, y % 8]; 
     color.B = color.B + bayer8x8[x % 8, y % 8]; 
     image.SetPixel(x, y, GetClosestColor(color, bitdepth); 
    } 
} 

mais le résultat est donc trop lumineux i décidé de vérifier la page wiki à nouveau et je vois qu'il ya un « 1/65 » à droite de la carte de seuil qui me fait penser à la fois l'erreur diffusant (oui je savoir, bizarre hein?) et en divisant la valeur que je reçois de bayer8x8[x % 8, y % 8] avec 65 et ensuite multiplier la valeur avec les canaux de couleur, mais soit les résultats étaient en désordre ou encore trop lumineux (comme je me souviens), mais les résultats étaient rien J'ai vu ailleurs, soit trop brillant, trop haut contraste ou trop brouillon et je n'ai rien trouvé de vraiment utile à chercher sur Internet, alors quelqu'un sait comment je peux obtenir ce bithering fonctionne correctement?

Merci à l'avance, les cookies

+0

Avez-vous une question? – dtb

+0

woops, l'a oublié en écrivant tout le reste: S –

+1

cela ne répond pas à votre question, mais Digital Halftoning (http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&tid=4433) pourrait être une bonne ressource à consulter. Ce manuel est la référence parente pour une grande partie du contenu de l'article Wikipedia. –

Répondre

1

Essayez ceci:

color.R = color.R + bayer8x8[x % 8, y % 8] * GAP/65; 

ici GAP devrait être la distance entre les deux seuils de couleurs les plus proches. Cela dépend des bits par pixel. Par exemple, si vous convertissez l'image pour utiliser 4 bits pour le composant rouge de chaque pixel, il y a 16 niveaux de total rouge. Ils sont: R = 0, R = 17, R = 34, ... R = 255. Donc, GAP serait 17.

+0

Je l'ai essayé et le résultat ne s'améliore que si BPP est bas BPP le résultat est trop brillant , mais si je l'édite, ça pourrait marcher, je vais vous le faire savoir –

1

trouvé une solution, levels est la quantité de couleurs des images de destination doivent avoir et d est le diviseur (ce qui est normalisé à partir de mon code (qui utilise des classes de Paint.NET) à Editting simple bitmap avec GetPixel et SetPixel)

private void ProcessDither(int levels, int d, Bitmap image) 
    { 
     levels -= 1; 
     double scale = (1.0/255d); 
     int t, l; 

     for (int y = rect.Top; y < rect.Bottom; y++) 
     { 
      for (int x = rect.Left; x < rect.Right; x++) 
      { 
       Color cp = image.GetPixel(x, y); 

       int threshold = matrix[y % rows][x % cols]; 

       t = (int)(scale * cp.R * (levels * d + 1)); 
       l = t/d; 
       t = t - l * d; 
       cp.R = Clamp(((l + (t >= threshold ? 1 : 0)) * 255/levels)); 

       t = (int)(scale * cp.G * (levels * d + 1)); 
       l = t/d; 
       t = t - l * d; 
       cp.G = Clamp(((l + (t >= threshold ? 1 : 0)) * 255/levels)); 

       t = (int)(scale * cp.B * (levels * d + 1)); 
       l = t/d; 
       t = t - l * d; 
       cp.B = Clamp(((l + (t >= threshold ? 1 : 0)) * 255/levels)); 

       image.SetPixel(x, y, cp); 
      } 
     } 
    } 

    private byte Clamp(int val) 
    { 
     return (byte)(val < 0 ? 0 : val > 255 ? 255 : val); 
    } 
+1

Mais, et malgré le cliché qui résonne, quelle est la matrice? Qu'est-ce qu'un bon algorithme pour produire cette matrice? –

5

Je ne pense pas qu'il y ait quelque chose de mal avec votre algorithme original (de Wikipedia). La disparité de luminosité est probablement un artefact du moniteur gamma. Vérifiez Joel Yliluoma's Positional Dithering Algorithm, l'annexe sur la correction gamma de cet article sur un algorithme de dithering inventé par Joel Yliluoma (http://bisqwit.iki.fi/story/howto/dither/jy/#Appendix%201GammaCorrection) pour voir une explication de l'effet (NB: la page est assez graphique-lourde).

Soit dit en passant, peut-être l'algorithme (apparemment domaine public) décrit dans cet article peut être la solution à votre problème ...