سؤال

أنا مبتدئ في مجال الكاكاو، ولدي بعض الشكوك فيما يتعلق بـ NSImage.

السؤال رقم 1:

لا يبدو أن تغيير أصل الحدود للصورة له أي تأثير.كنت أتوقع أن يتم استخلاص الصورة من الأصل المحدد حديثًا ولكن لا يبدو أن هذا هو الحال.هل فاتني شيء ؟

شفرة:

NSImage* carImage = [NSImage imageNamed:@"car"];

[self.imageView setImage:carImage];

//Following line has no effect:
self.imageView.bounds = CGRectMake(self.imageView.bounds.origin.x + 100, self.imageView.bounds.origin.y, self.imageView.bounds.size.width,self.imageView.bounds.size.height);

ملحوظة:imageView هو IBOutlet

السؤال 2:

كنت أحاول اقتصاص صورة، لكن لا يبدو أنني أقوم بقص الصورة، أستطيع رؤية الصورة كاملة.ما هو ذلك الذي أفتقده؟

شفرة:

NSRect sourceRect = CGRectMake(150, 25, 100, 50);
NSRect destRect = CGRectMake(0, 0, 100, 50);

NSImage* carImage = [NSImage imageNamed:@"car"];

[carImage drawInRect:destRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0];

[self.imageView setImage:carImage];

شكرًا

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

المحلول

لا يبدو أن تغيير أصل الحدود للصورة له أي تأثير.…

//Following line has no effect:
self.imageView.bounds = CGRectMake(self.imageView.bounds.origin.x + 100, self.imageView.bounds.origin.y, self.imageView.bounds.size.width,self.imageView.bounds.size.height);

هذا عرض صورة، وليس صورة.

يعتمد تأثير تغيير حدود العرض على ما يفعله العرض للرسم.على نحو فعال، هذا يعني أنه لا ينبغي عليك تغيير حدود طريقة العرض التي ليست مثيلًا لفئة عرض قمت بإنشائها، حيث لا يمكنك التنبؤ بالضبط كيف سيرسم NSImageView صورته (من المفترض، نظرًا لأنه عنصر تحكم، فإنه يتضمن خليته، ولكن أكثر من ذلك، لن أعتمد عليه).

بشكل عام، من النادر جدًا تغيير أصل حدود طريقة العرض.لا أتذكر أنني قمت بذلك من قبل، ولا أستطيع التفكير في سبب وجيه للقيام بذلك.سيؤدي تغيير حجم حدوده إلى تغيير الحجم وليس الاقتصاص.

كنت أحاول اقتصاص صورة، لكن لا يبدو أنني أقوم بقص الصورة، أستطيع رؤية الصورة كاملة.ما هو ذلك الذي أفتقده؟

[carImage drawInRect:destRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0];

[self.imageView setImage:carImage];

إن إخبار الصورة بالرسم لا يغير أي شيء في الصورة.لن يقوم "باقتصاص الصورة" بحيث تصبح الصورة بعد ذلك أصغر أو أكبر.أنت تقول له أن يرسم، لا أكثر.

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

ما يفعله إخبار الصورة بالرسم هو بالضبط ما يلي:ويقول الصورة لرسم.هناك مكانان صحيحان فقط للقيام بذلك:

  1. ما بين أثنين lockFocus و unlockFocus الرسائل إلى عرض أو صورة (أو بعد تعيين NSGraphicsContext الحالي).
  2. ضمن وجهة نظر drawRect: طريقة.

في أي مكان آخر، يجب ألا تطلب من أي كائن كاكاو أن يرسم.

إحدى الطرق الصحيحة لاقتصاص الصورة هي إنشاء صورة جديدة بالحجم المطلوب/المعدّل، وقفل التركيز عليها، ورسم الجزء المطلوب من الصورة الأصلية فيها، وفتح التركيز على الصورة الجديدة.سيكون لديك بعد ذلك النسخة الأصلية والنسخة المقصوصة.

هناك طريقة أخرى صحيحة تتمثل في إنشاء طريقة عرض الصور المخصصة الخاصة بك والتي تحتوي على خاصيتين:أحدهما يمتلك صورة للرسم، والآخر يحمل مستطيلاً.عندما يُطلب منك الرسم، فإن هذا العرض المخصص سيطلب من الصورة أن ترسم المستطيل المحدد داخل حدود العرض.ستحتفظ دائمًا بالصورة الأصلية وترسم ببساطة القسم المطلوب فقط.

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