কীভাবে ফটোশপ দুটি চিত্র একসাথে মিশে যায়? [বন্ধ]


84

কেউ দয়া করে ব্যাখ্যা করতে পারেন যে কীভাবে ফটোশপ দুটি চিত্র একসাথে মিশ্রিত করে যাতে আমি আমার অ্যাপ্লিকেশনে একই প্রভাবগুলি পুনরুত্পাদন করতে পারি।


4
এটি অবশ্যই সাধারণ কম্পিউটিং হার্ডওয়্যার বা সফ্টওয়্যার সম্পর্কে কোনও প্রশ্ন নয় । এটি অ্যালগরিদম, সি ++ এবং চিত্র প্রক্রিয়াকরণ সম্পর্কে। এই ধরণের প্রশ্নটি স্পষ্টভাবে অনুমোদিত এবং সক্রিয়ভাবে উত্সাহিত
Panagiotis Kanavos

4
এই সাইটে 8 বছর ড্রাইভিং ক্লিকের পরে কি কেবল এখন এটিকে বিষয়বস্তু হিসাবে বিবেচনা করা হবে?
নাথন মoinনভাজিরী

এটির জন্য কমপক্ষে 3000 জন প্রতিনিধি সহ লোকের কাছ থেকে 5 টি কাছাকাছি ভোট দরকার All এটি বরং
স্পষ্টত

PS: 4 টি ডাউনভোটের বয়স 8 বছর হতে পারে। কেউ হয়ত গত সপ্তাহে কাছাকাছি সারিতে প্রশ্নটির মুখোমুখি হয়েছিলেন এবং বন্ধ করার পক্ষে ভোট দিয়েছেন। তাই তাই হয়েছে অনেক প্রশ্ন ডান এখন এটি কোন প্রশ্ন করতে যথাযথ মনোযোগ দিতে কঠিন। সম্পাদনা ইতিহাস দেখায় যে মূল প্রশ্নটিরও কিছুটা সম্পাদনার দরকার ছিল
পানাজিওটিস কানভোস

সম্ভবত 3 টি পুনর্বিবেচনা বা এর অনুরূপ কিছুতে প্রত্যাবর্তন করা এটিকে পর্যালোচকদের দ্বারা পুনরায় খোলার সম্ভাবনা তৈরি করবে। বর্তমান অবস্থায়, "আমি কীভাবে ফটোশপ ব্যবহার করব" প্রশ্ন হিসাবে প্রশ্নটিকে ভুল করা সহজ, এবং কোনও গবেষণামূলক প্রচেষ্টা না দেখিয়ে খারিজ করে দেওয়াও সহজ।
অ্যাডাম মিলারচিপ

উত্তর:


210

বি এ ছবিতে এর সাথে সম্পর্কিত পিক্সেলের বিপরীতে ইমেজ এ এর ​​প্রতিটি পিক্সেলের সাথে মিশ্রণ অপারেশন করে ফটোশপ দুটি চিত্রকে একত্রে মিশ্রিত করে Each ধরে নিই আমরা আরজিবি পিক্সেল নিয়ে কাজ করছি, প্রতিটি পিক্সেলের চ্যানেলগুলি লাল, সবুজ এবং নীল হবে। দুটি পিক্সেল মিশ্রন করতে আমরা তাদের নিজ নিজ চ্যানেল মিশ্রিত করি।

ফটোশপের প্রতিটি মিশ্রণ মোডের জন্য সংমিশ্রণ ক্রিয়াকলাপটি নিম্নলিখিত ম্যাক্রোগুলিতে সংক্ষিপ্ত করা যেতে পারে:

#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))
#define ChannelBlend_Alpha(A,B,O)    ((uint8)(O * A + (1 - O) * B))
#define ChannelBlend_AlphaF(A,B,F,O) (ChannelBlend_Alpha(F(A,B),A,O))

একটি একক আরজিবি পিক্সেল মিশ্রন করতে আপনি নিম্নলিখিতগুলি করতে হবে:

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

ImageTColor = RGB(ImageTColorR, ImageTColorB, ImageTColorG);

যদি আমরা একটি নির্দিষ্ট অস্বচ্ছতার সাথে একটি মিশ্রণ অপারেশন করতে চাই, তবে 50% বলুন:

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

এবং উদাহরণটি হ'ল:

ColorBlend_Glow(TargetPtr, ImageAPtr, ImageBPtr);

ফটোশপের মিশ্রণগুলির বাকি অংশগুলিতে আরজিবিকে এইচএলএস এবং আবার ফিরে রূপান্তর করা জড়িত।

#define ColorBlend_Hue(T,A,B)            ColorBlend_Hls(T,A,B,HueB,LuminationA,SaturationA)
#define ColorBlend_Saturation(T,A,B)     ColorBlend_Hls(T,A,B,HueA,LuminationA,SaturationB)
#define ColorBlend_Color(T,A,B)          ColorBlend_Hls(T,A,B,HueB,LuminationA,SaturationB)
#define ColorBlend_Luminosity(T,A,B)     ColorBlend_Hls(T,A,B,HueA,LuminationB,SaturationA)

#define ColorBlend_Hls(T,A,B,O1,O2,O3) {
    float64 HueA, LuminationA, SaturationA;
    float64 HueB, LuminationB, SaturationL;
    Color_RgbToHls((A)[2],(A)[1],(A)[0], &HueA, &LuminationA, &SaturationA);
    Color_RgbToHls((B)[2],(B)[1],(B)[0], &HueB, &LuminationB, &SaturationB);
    Color_HlsToRgb(O1,O2,O3,&(T)[2],&(T)[1],&(T)[0]);
    }

এই ফাংশনগুলি আরজিবিকে এইচএলএসে রূপান্তর করতে সহায়ক হবে।

int32 Color_HueToRgb(float64 M1, float64 M2, float64 Hue, float64 *Channel)
{
    if (Hue < 0.0)
        Hue += 1.0;
    else if (Hue > 1.0)
        Hue -= 1.0;

    if ((6.0 * Hue) < 1.0)
        *Channel = (M1 + (M2 - M1) * Hue * 6.0);
    else if ((2.0 * Hue) < 1.0)
        *Channel = (M2);
    else if ((3.0 * Hue) < 2.0)
        *Channel = (M1 + (M2 - M1) * ((2.0F / 3.0F) - Hue) * 6.0);
    else
        *Channel = (M1);

    return TRUE;
}

int32 Color_RgbToHls(uint8 Red, uint8 Green, uint8 Blue, float64 *Hue, float64 *Lumination, float64 *Saturation)
{
    float64 Delta;
    float64 Max, Min;
    float64 Redf, Greenf, Bluef;

    Redf    = ((float64)Red   / 255.0F);
    Greenf  = ((float64)Green / 255.0F);
    Bluef   = ((float64)Blue  / 255.0F); 

    Max     = max(max(Redf, Greenf), Bluef);
    Min     = min(min(Redf, Greenf), Bluef);

    *Hue        = 0;
    *Lumination = (Max + Min) / 2.0F;
    *Saturation = 0;

    if (Max == Min)
        return TRUE;

    Delta = (Max - Min);

    if (*Lumination < 0.5)
        *Saturation = Delta / (Max + Min);
    else
        *Saturation = Delta / (2.0 - Max - Min);

    if (Redf == Max)
        *Hue = (Greenf - Bluef) / Delta;
    else if (Greenf == Max)
        *Hue = 2.0 + (Bluef - Redf) / Delta;
    else
        *Hue = 4.0 + (Redf - Greenf) / Delta;

    *Hue /= 6.0; 

    if (*Hue < 0.0)
        *Hue += 1.0;       

    return TRUE;
}

int32 Color_HlsToRgb(float64 Hue, float64 Lumination, float64 Saturation, uint8 *Red, uint8 *Green, uint8 *Blue)
{
    float64 M1, M2;
    float64 Redf, Greenf, Bluef;

    if (Saturation == 0)
        {
        Redf    = Lumination;
        Greenf  = Lumination;
        Bluef   = Lumination;
        }
    else
        {
        if (Lumination <= 0.5)
            M2 = Lumination * (1.0 + Saturation);
        else
            M2 = Lumination + Saturation - Lumination * Saturation;

        M1 = (2.0 * Lumination - M2);

        Color_HueToRgb(M1, M2, Hue + (1.0F / 3.0F), &Redf);
        Color_HueToRgb(M1, M2, Hue, &Greenf);
        Color_HueToRgb(M1, M2, Hue - (1.0F / 3.0F), &Bluef);
        }

    *Red    = (uint8)(Redf * 255);
    *Blue   = (uint8)(Bluef * 255);
    *Green  = (uint8)(Greenf * 255);

    return TRUE;
}

এই বিষয়টিতে আরও সংস্থান রয়েছে, মূলত:

  1. পেগটপ ব্লেন্ড মোড
  2. ফরেনসিক ফটোশপ
  3. ফটোশপ 7.0 মিশ্রণ মোডের অন্তর্দৃষ্টি
  4. এসএফ - বেসিকস - মিশ্রন মোডগুলি
  5. মিশ্রণ মোড শেষ
  6. রোমজ ব্লগ
  7. ReactOS আরজিবি-এইচএলএস রূপান্তর ফাংশন

4
হ্যাঁ, দুর্দান্ত উত্তর, ধন্যবাদ! আমি ভাবছিলাম যে কেউ যদি ফটোশপে লেয়ার অপাস্টিটি হয় কী করে জানেন? অর্থাত আমি মিশ্রণ
গা dark়

4
প্রদত্ত আলফা সূত্রটি সম্পূর্ণ নয় - এটি কেবল সেই ক্ষেত্রে কাজ করে যেখানে পটভূমি সম্পূর্ণরূপে অস্বচ্ছ। যদি পটভূমি স্বচ্ছ হয়, অঙ্কনের পরে ফলাফল স্বচ্ছ হতে পারে। আপনাকে আরও সাধারণ ক্ষেত্রে উইকিপিডিয়ায় বর্ণিত আলফা মিশ্রণ প্রয়োগ করতে হবে ।
তারপরে ডিউড

4
আলফা চ্যানেল সম্পর্কে কি? আমি কি এছাড়াও এটিতে ফাংশন প্রয়োগ করা উচিত?
আখি

দুর্দান্ত উত্তর !! প্রতিবিম্ব এবং গ্লো পরিবর্তন করা হয়। অন্যথায়: দুর্দান্ত !! (আলফা-কম্পোজিটিং অনুপস্থিত যদিও ..)
খেলার বড় মার্বেলগুলি

সি # আলফা-কম্প'িংয়ের জন্য সমাধান: স্ট্যাটিক কালার আলফা কমপোজিট (রঙ সি 1, রঙ সি 2, রঙ সিবি, ফ্ল্যাট ওপ) at ফ্লোট এ 1, এ 2, আব, আর = 1; ar = v [c1.A] + v [c2.A] * অপ - (ভি [সি 1.এ] * ভি [সি 2.এ] * অপ); ভাসা asr = ভি [সি 2.এ] * অপ / এআর; a1 = 1 - asr; এ 2 = আসর * (1 - ভি [সি 1.এ]); ab = asr * v [c1.A]; বাইট r = (বাইট) (c1.R * a1 + c2.R * a2 + cb.R * আব); বাইট g = (বাইট) (c1.G * a1 + c2.G * a2 + cb.G * আব); বাইট বি = (বাইট) (c1.B * a1 + c2.B * a2 + cb.B * আব); রিটার্ন কালার.ফ্রমআর্গ ((বাইট) (আর * 255), আর, জি, বি); }
তাজ

7

এই উত্তরে হিউ, কালার, স্যাচুরেশন ব্লেন্ডিং মোডগুলি ভুল। কোনও অ্যাডোব পণ্য এইচএসবিতে রূপান্তর করে না, তারা সরাসরি আরজিবি মানগুলিতে অপারেশন করে।

আলোকসজ্জা স্থাপনের জন্য এখানে জিএলএসএল রয়েছে:

float lum(vec4 color)
{
    return ((0.3 * color.r) + (0.59 * color.g) + (0.11 * color.b));
}

vec4 clipColor(vec4 color)
{
    vec4 newColor=color;
    float l=lum(color);
    float n=min(min(color.r,color.g),color.b);
    float x=max(max(color.r,color.g),color.b);

    newColor.r=(n<0.0) ? l+(((color.r-l)*l)/(l-n)) : color.r;
    newColor.r=(x>1.0) ? l+(((color.r-l)*(1.0-l))/(x-l)) : color.r;

    newColor.g=(n<0.0) ? l+(((color.g-l)*l)/(l-n)) : color.g;
    newColor.g=(x>1.0) ? l+(((color.g-l)*(1.0-l))/(x-l)) : color.g;

    newColor.b=(n<0.0) ? l+(((color.b-l)*l)/(l-n)) : color.b;
    newColor.b=(x>1.0) ? l+(((color.b-l)*(1.0-l))/(x-l)) : color.b;

    return clamp(newColor,0.0,1.0);
}

vec4 setlum(vec4 color, float l)
{
    float d=l-lum(color);
    color.r+=d;
    color.g+=d;
    color.b+=d;

    return clipColor(color);    
}

kernel vec4 blendLuminosity(sampler topimage, sampler bottomimage)
{
    vec4 base=sample(bottomimage, samplerCoord(bottomimage));
    vec4 blend=sample(topimage, samplerCoord(topimage));

    float bl=lum(blend);
    return setlum(base,bl);
}

যদি সিআই কার্নেলগুলিতে অন্য বিবৃতি দেয় তবে এর জন্য কোনও সমর্থন নেই, সুতরাং টের্নারি অপারেটরগুলির ব্যবহার।


4

জনপ্রিয় উত্তরটি 99.9% সঠিক, তবে গ্রেফ্রিয়ার্স যেমন বলেছে, এটি সঠিক ফলাফলটি পাবে না কারণ অ্যাডোব মিশ্রণের ক্ষেত্রে কোনও মুহূর্ত এইচএলএস ব্যবহার করে না।

তবে এটি করার জন্য আপনার অ্যাডোবে কাজ করার দরকার নেই ... আপনি এই নথিতে অ্যাডোব থেকে এখানে সমস্ত বিধি অনুসরণ করে ঠিক একই মিশ্রণে পৌঁছে যেতে পারেন:

মূলত অধ্যায় 4 এবং 7: http://partners.adobe.com/public/developer/en/pdf/PDFReferences.pdf

তারপরে আপনি ঠিক ঠিক পৌঁছে যাবেন ঠিক যেমন অ্যাডোব! পিক্সেল বাই পিক্সেল!


i.imgur.com/G5MbHOH.png এতে বলা হয়েছে যে লিঙ্কটিতে এইচএসএল ব্যবহার করা হয়েছে (আমি এখানে অনুসরণ করেছি কারণ সেই লিঙ্কটি আমার জন্য ভেঙে গেছে: অ্যাডোব / কনটেন্ট / ড্যাম / অ্যাকোম / স্পেন / দেবনেট / পিডিএফ / পিডিএফস / জি )
eri0o

0

জনপ্রিয় উত্তরটি বেশিরভাগ ক্ষেত্রে সঠিক হলেও নিম্নলিখিত বিবৃতিটি ভুল। "ফটোশপের মিশ্রণগুলির বাকি অংশগুলিতে আরজিবিকে এইচএলএসে রূপান্তর করতে এবং আবার ফিরে আসে" " না, ফটোশপ (এবং কেবল ফটোশপ) এইচএলএসের পরিবর্তে ক্রোমা এবং লুমা ব্যবহার করে।

সুতরাং হিউ, কালার, লাইটোনিসিটি এবং স্যাচুরেশন মোডগুলির জন্য আপনি সাধারণ অ্যালগরিদম ব্যবহার করতে পারবেন না। এই ক্ষেত্রে ফটোশপের পদ্ধতিটি মেলানোর জন্য আপনাকে অ্যাডোবের পক্ষে কাজ করা দরকার।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.