How Photoshop Merges Images
Photoshop seamlessly blends images by executing a blend operation on each pixel of image A with its corresponding pixel in image B. Each pixel is composed of multiple channels, with each channel representing a color. For RGB pixels, these channels include red, green, and blue.
To merge two pixels, their respective channels are combined using specific blend operations. Photoshop's blend modes employ the following mathematical functions:
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))
To blend a single RGB pixel:
ImageTColorR = ChannelBlend_Glow(ImageAColorR, ImageBColorR); ImageTColorB = ChannelBlend_Glow(ImageAColorB, ImageBColorB); ImageTColorG = ChannelBlend_Glow(ImageAColorG, ImageBColorG); ImageTColor = RGB(ImageTColorR, ImageTColorB, ImageTColorG);
For blending with a specific opacity (e.g., 50%):
ImageTColorR = ChannelBlend_AlphaF(ImageAColorR, ImageBColorR, Blend_Subtract, 0.5F);
To simplify the blending of all three channels, a buffer macro can be used:
#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])
Resulting in the following RGB color blend macros:
#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)
Example:
ColorBlend_Glow(TargetPtr, ImageAPtr, ImageBPtr);
For blend modes involving HLS conversion:
#define ColorBlend_Hue(T, A, B) ColorBlend_Hls(T, A, B, HueB, LuminationA, SaturationA)
The above is the detailed content of How does Photoshop blend images, and what are the different blend modes available?. For more information, please follow other related articles on the PHP Chinese website!