Maison > développement back-end > C++ > Comment Photoshop mélange-t-il les images et quels sont les différents modes de fusion disponibles ?

Comment Photoshop mélange-t-il les images et quels sont les différents modes de fusion disponibles ?

Mary-Kate Olsen
Libérer: 2024-11-20 14:47:11
original
304 Les gens l'ont consulté

How does Photoshop blend images, and what are the different blend modes available?

Comment Photoshop fusionne les images

Photoshop mélange les images de manière transparente en exécutant une opération de fusion sur chaque pixel de l'image A avec son pixel correspondant dans l'image B Chaque pixel est composé de plusieurs canaux, chaque canal représentant une couleur. Pour les pixels RVB, ces canaux incluent le rouge, le vert et le bleu.

Pour fusionner deux pixels, leurs canaux respectifs sont combinés à l'aide d'opérations de fusion spécifiques. Les modes de fusion de Photoshop utilisent les fonctions mathématiques suivantes :

ChannelBlend_Normal:         ((uint8) A)
ChannelBlend_Lighten:      ((uint8) (B > A) ? B : A)
ChannelBlend_Darken:       ((uint8) (B > A) ? A : B)
ChannelBlend_Multiply:     ((uint8) ((A * B) / 255))
ChannelBlend_Average:      ((uint8) ((A + B) / 2))
ChannelBlend_Add:          ((uint8) min(255, (A + B))))
ChannelBlend_Subtract:     ((uint8) ((A + B < 255) ? 0 : (A + B - 255)))
ChannelBlend_Difference:  ((uint8) abs(A - B))
ChannelBlend_Negation:    ((uint8) (255 - abs(255 - A - B)))
ChannelBlend_Screen:      ((uint8) (255 - (((255 - A) * (255 - B)) >> 8)))
ChannelBlend_Exclusion:   ((uint8) (A + B - 2 * A * B / 255))
ChannelBlend_Overlay:     ((uint8) (B < 128) ? (2 * A * B / 255) : (255 - 2 * (255 - A) * (255 - B) / 255)))
ChannelBlend_SoftLight:   ((uint8) (B < 128) ? (2 * ((A >> 1) + 64)) * ((float) B / 255) : (255 - 2 * (255 - ((A >> 1) + 64)) * (float) (255 - B) / 255))))
ChannelBlend_HardLight:   (ChannelBlend_Overlay(B, A))
ChannelBlend_ColorDodge:  ((uint8) (B == 255) ? B : min(255, ((A << 8 ) / (255 - B)))))
ChannelBlend_ColorBurn:   ((uint8) (B == 0) ? B : max(0, (255 - ((255 - A) << 8 ) / B))))
ChannelBlend_LinearDodge: (ChannelBlend_Add(A, B))
ChannelBlend_LinearBurn:  (ChannelBlend_Subtract(A, B))
ChannelBlend_LinearLight: ((uint8) (B < 128) ? ChannelBlend_LinearBurn(A, (2 * B)) : ChannelBlend_LinearDodge(A, (2 * (B - 128)))))
ChannelBlend_VividLight:  ((uint8) (B < 128) ? ChannelBlend_ColorBurn(A, (2 * B)) : ChannelBlend_ColorDodge(A, (2 * (B - 128)))))
ChannelBlend_PinLight:    ((uint8) (B < 128) ? ChannelBlend_Darken(A, (2 * B)) : ChannelBlend_Lighten(A, (2 * (B - 128)))))
ChannelBlend_HardMix:     ((uint8) ((ChannelBlend_VividLight(A, B) < 128) ? 0 : 255))
ChannelBlend_Reflect:     ((uint8) (B == 255) ? B : min(255, (A * A / (255 - B)))))
ChannelBlend_Glow:        (ChannelBlend_Reflect(B, A))
ChannelBlend_Phoenix:     ((uint8) (min(A, B) - max(A, B) + 255))
ChannelBlend_Alpha:       ((uint8) (O * A + (1 - O) * B))
ChannelBlend_AlphaF:      (ChannelBlend_Alpha(F(A, B), A, O))
Copier après la connexion

Pour mélanger un seul pixel RVB :

ImageTColorR = ChannelBlend_Glow(ImageAColorR, ImageBColorR);
ImageTColorB = ChannelBlend_Glow(ImageAColorB, ImageBColorB);
ImageTColorG = ChannelBlend_Glow(ImageAColorG, ImageBColorG);

ImageTColor = RGB(ImageTColorR, ImageTColorB, ImageTColorG);
Copier après la connexion

Pour une fusion avec une opacité spécifique (par exemple, 50 %) :

ImageTColorR = ChannelBlend_AlphaF(ImageAColorR, ImageBColorR, Blend_Subtract, 0.5F);
Copier après la connexion

Pour simplifier le mélange des trois canaux, une macro tampon peut être utilisé :

#define ColorBlend_ ## M(T, A, B) (T)[0] = ChannelBlend_ ## M((A)[0], (B)[0]), (T)[1] = ChannelBlend_ ## M((A)[1], (B)[1]), (T)[2] = ChannelBlend_ ## M((A)[2], (B)[2])
Copier après la connexion

Résultatant des macros de mélange de couleurs RVB suivantes :

#define ColorBlend_Normal(T, A, B) ColorBlend_Buffer(T, A, B, Normal)
#define ColorBlend_Lighten(T, A, B) ColorBlend_Buffer(T, A, B, Lighten)
#define ColorBlend_Darken(T, A, B) ColorBlend_Buffer(T, A, B, Darken)
#define ColorBlend_Multiply(T, A, B) ColorBlend_Buffer(T, A, B, Multiply)
#define ColorBlend_Average(T, A, B) ColorBlend_Buffer(T, A, B, Average)
#define ColorBlend_Add(T, A, B) ColorBlend_Buffer(T, A, B, Add)
#define ColorBlend_Subtract(T, A, B) ColorBlend_Buffer(T, A, B, Subtract)
#define ColorBlend_Difference(T, A, B) ColorBlend_Buffer(T, A, B, Difference)
#define ColorBlend_Negation(T, A, B) ColorBlend_Buffer(T, A, B, Negation)
#define ColorBlend_Screen(T, A, B) ColorBlend_Buffer(T, A, B, Screen)
#define ColorBlend_Exclusion(T, A, B) ColorBlend_Buffer(T, A, B, Exclusion)
#define ColorBlend_Overlay(T, A, B) ColorBlend_Buffer(T, A, B, Overlay)
#define ColorBlend_SoftLight(T, A, B) ColorBlend_Buffer(T, A, B, SoftLight)
#define ColorBlend_HardLight(T, A, B) ColorBlend_Buffer(T, A, B, HardLight)
#define ColorBlend_ColorDodge(T, A, B) ColorBlend_Buffer(T, A, B, ColorDodge)
#define ColorBlend_ColorBurn(T, A, B) ColorBlend_Buffer(T, A, B, ColorBurn)
#define ColorBlend_LinearDodge(T, A, B) ColorBlend_Buffer(T, A, B, LinearDodge)
#define ColorBlend_LinearBurn(T, A, B) ColorBlend_Buffer(T, A, B, LinearBurn)
#define ColorBlend_LinearLight(T, A, B) ColorBlend_Buffer(T, A, B, LinearLight)
#define ColorBlend_VividLight(T, A, B) ColorBlend_Buffer(T, A, B, VividLight)
#define ColorBlend_PinLight(T, A, B) ColorBlend_Buffer(T, A, B, PinLight)
#define ColorBlend_HardMix(T, A, B) ColorBlend_Buffer(T, A, B, HardMix)
#define ColorBlend_Reflect(T, A, B) ColorBlend_Buffer(T, A, B, Reflect)
#define ColorBlend_Glow(T, A, B) ColorBlend_Buffer(T, A, B, Glow)
#define ColorBlend_Phoenix(T, A, B) ColorBlend_Buffer(T, A, B, Phoenix)
Copier après la connexion

Exemple :

ColorBlend_Glow(TargetPtr, ImageAPtr, ImageBPtr);
Copier après la connexion

Pour les modes de fusion impliquant une conversion HLS :

#define ColorBlend_Hue(T, A, B) ColorBlend_Hls(T, A, B, HueB, LuminationA, SaturationA)
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal