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
Lepaskan: 2024-11-20 14:47:11
asal
281 orang telah melayarinya

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))
Salin selepas log masuk

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);
Salin selepas log masuk

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

ImageTColorR = ChannelBlend_AlphaF(ImageAColorR, ImageBColorR, Blend_Subtract, 0.5F);
Salin selepas log masuk

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])
Salin selepas log masuk

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)
Salin selepas log masuk

Contoh :

ColorBlend_Glow(TargetPtr, ImageAPtr, ImageBPtr);
Salin selepas log masuk

Untuk mod campuran yang melibatkan penukaran HLS:

#define ColorBlend_Hue(T, A, B) ColorBlend_Hls(T, A, B, HueB, LuminationA, SaturationA)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan