سؤال

يمكن القيام به عن طريق mallocing صورة نقطية مؤقتة مع 32 بايت لكل بكسل ثم تطهير مكون ألفا مع حلقة وأخيراً أعادها إلى nsimage مرة أخرى.

أظن أنه يمكن القيام بطريقة أبسط باستخدام مزيج ذكي من nscolor و nscompositingoperation. أو ربما تحتاج الصورة إلى تكوينها مع نفسها باستخدام DrawAtpoint.

رمزتي تبدو هكذا.

NSImage* img = some image with RGB and Alpha;
NSRect rect  = some rect inside the image;
[img lockFocus];
[[NSColor clearColor] set];
NSRectFillUsingOperation(rect, NSCompositeXOR);
[img unlockFocus];

ملاحظة: يمكن إجراء إعداد قناة ألفا على 1 باستخدام ألوان BlackColor مع NSCompositePlusLighter.

ما هو سر تطهير قناة ألفا؟

هل كانت مفيدة؟

المحلول

لن يكون سريعًا ولكن هذا سيعمل أيضًا:

   NSImage *newImage = [[NSImage alloc] initWithSize:[srcImage size]];
   [newImage lockFocus];
   [[NSColor whiteColor] set];
   NSRectFill(NSMakeRect(0,0,[newImage size].width, [newImage size].height));
   [srcImage compositeToPoint:NSZeroPoint operation:NSCompositeCopy];
   [newImage unlockFocus];

نصائح أخرى

(1) يرجى قراءة ملاحظات إصدار AppKit حول موضوع قابلية تبادل الصورة. يجب أن يعامل Nsimage بشكل أساسي على أنه غير قابل للتغيير.

(2) كل من تنسيقات البكسل المدعومة في سياقات الرسومات لديك alpha premultiplied. إذا كانت قناة ألفا صفرًا ، فيجب أن تكون القنوات الأخرى صفراً أيضًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top