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
Mary-Kate Olsenoriginal
2024-11-20 14:47:11284parcourir

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

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

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

ImageTColorR = ChannelBlend_AlphaF(ImageAColorR, ImageBColorR, Blend_Subtract, 0.5F);

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

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)

Exemple :

ColorBlend_Glow(TargetPtr, ImageAPtr, ImageBPtr);

Pour les modes de fusion impliquant une conversion HLS :

#define ColorBlend_Hue(T, A, B) ColorBlend_Hls(T, A, B, HueB, LuminationA, SaturationA)

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!

Déclaration:
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