Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Photoshop menggabungkan imej, dan apakah mod campuran berbeza yang tersedia?

Bagaimanakah Photoshop menggabungkan imej, dan apakah mod campuran berbeza yang tersedia?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-20 14:47:11353semak imbas

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

Cara Photoshop Menggabungkan Imej

Photoshop menggabungkan imej dengan lancar dengan melaksanakan operasi gabungan pada setiap piksel imej A dengan piksel yang sepadan dalam imej B Setiap piksel terdiri daripada berbilang saluran, dengan setiap saluran mewakili satu warna. Untuk piksel RGB, saluran ini termasuk merah, hijau dan biru.

Untuk menggabungkan dua piksel, saluran masing-masing digabungkan menggunakan operasi gabungan tertentu. Mod campuran Photoshop menggunakan fungsi matematik berikut:

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

Untuk menggabungkan satu piksel RGB:

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

ImageTColor = RGB(ImageTColorR, ImageTColorB, ImageTColorG);

Untuk mengadun dengan kelegapan tertentu (cth., 50%):

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

Untuk memudahkan pengadunan ketiga-tiga saluran, makro penimbal boleh digunakan:

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

Menghasilkan makro gabungan warna RGB berikut:

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

Contoh :

ColorBlend_Glow(TargetPtr, ImageAPtr, ImageBPtr);

Untuk mod campuran yang melibatkan penukaran HLS:

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

Atas ialah kandungan terperinci Bagaimanakah Photoshop menggabungkan imej, dan apakah mod campuran berbeza yang tersedia?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn