Photoshop 的图像混合技术
在 Photoshop 中,图像混合涉及将两个图像逐像素组合,使用各种混合模式来实现不同的效果。每种混合模式都对每个像素的单独颜色通道(红色、绿色和蓝色)进行操作。
Photoshop 使用特定的宏来执行这些混合模式:
#define ChannelBlend_Normal(A,B) ((uint8)(A)) #define ChannelBlend_Lighten(A,B) ((uint8)((B > A) ? B:A)) #define ChannelBlend_Darken(A,B) ((uint8)((B > A) ? A:B)) #define ChannelBlend_Multiply(A,B) ((uint8)((A * B) / 255)) #define ChannelBlend_Average(A,B) ((uint8)((A + B) / 2)) #define ChannelBlend_Add(A,B) ((uint8)(min(255, (A + B)))) #define ChannelBlend_Subtract(A,B) ((uint8)((A + B < 255) ? 0:(A + B - 255))) #define ChannelBlend_Difference(A,B) ((uint8)(abs(A - B))) #define ChannelBlend_Negation(A,B) ((uint8)(255 - abs(255 - A - B))) #define ChannelBlend_Screen(A,B) ((uint8)(255 - (((255 - A) * (255 - B)) >> 8))) #define ChannelBlend_Exclusion(A,B) ((uint8)(A + B - 2 * A * B / 255)) #define ChannelBlend_Overlay(A,B) ((uint8)((B < 128) ? (2 * A * B / 255):(255 - 2 * (255 - A) * (255 - B) / 255))) #define ChannelBlend_SoftLight(A,B) ((uint8)((B < 128)?(2*((A>>1)+64))*((float)B/255):(255-(2*(255-((A>>1)+64))*(float)(255-B)/255)))) #define ChannelBlend_HardLight(A,B) (ChannelBlend_Overlay(B,A)) #define ChannelBlend_ColorDodge(A,B) ((uint8)((B == 255) ? B:min(255, ((A << 8 ) / (255 - B))))) #define ChannelBlend_ColorBurn(A,B) ((uint8)((B == 0) ? B:max(0, (255 - ((255 - A) << 8 ) / B)))) #define ChannelBlend_LinearDodge(A,B)(ChannelBlend_Add(A,B)) #define ChannelBlend_LinearBurn(A,B) (ChannelBlend_Subtract(A,B)) #define ChannelBlend_LinearLight(A,B)((uint8)(B < 128)?ChannelBlend_LinearBurn(A,(2 * B)):ChannelBlend_LinearDodge(A,(2 * (B - 128)))) #define ChannelBlend_VividLight(A,B) ((uint8)(B < 128)?ChannelBlend_ColorBurn(A,(2 * B)):ChannelBlend_ColorDodge(A,(2 * (B - 128)))) #define ChannelBlend_PinLight(A,B) ((uint8)(B < 128)?ChannelBlend_Darken(A,(2 * B)):ChannelBlend_Lighten(A,(2 * (B - 128)))) #define ChannelBlend_HardMix(A,B) ((uint8)((ChannelBlend_VividLight(A,B) < 128) ? 0:255)) #define ChannelBlend_Reflect(A,B) ((uint8)((B == 255) ? B:min(255, (A * A / (255 - B))))) #define ChannelBlend_Glow(A,B) (ChannelBlend_Reflect(B,A)) #define ChannelBlend_Phoenix(A,B) ((uint8)(min(A,B) - max(A,B) + 255))
混合 RGB使用这些宏的像素:
ImageTColorR = ChannelBlend_Glow(ImageAColorR, ImageBColorR); ImageTColorB = ChannelBlend_Glow(ImageAColorB, ImageBColorB); ImageTColorG = ChannelBlend_Glow(ImageAColorG, ImageBColorG); ImageTColor = RGB(ImageTColorR, ImageTColorB, ImageTColorG);
如果需要不透明度(50% opacity):
ImageTColorR = ChannelBlend_AlphaF(ImageAColorR, ImageBColorR, Blend_Subtract, 0.5F);
使用缓冲区,我们可以简化所有三个颜色通道的混合:
#define ColorBlend_Buffer(T,A,B,M) (T)[0] = ChannelBlend_##M((A)[0], (B)[0]), (T)[1] = ChannelBlend_##M((A)[1], (B)[1]), (T)[2] = ChannelBlend_##M((A)[2], (B)[2])
常见混合模式的宏:
#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))
以上是Photoshop 如何使用宏实现不同的混合模式?的详细内容。更多信息请关注PHP中文网其他相关文章!