كيف تدمر عدة nsimages في صورة واحدة كبيرة؟
-
24-09-2019 - |
سؤال
لديّ مجموعة من الكائنات التي تصف اسم الصورة وحجمها وموقعها x/y. يتم فرز المجموعة بواسطة "طبقات" ، حتى أتمكن من تركيب الصور في نوع من خوارزمية الرسام.
من هذا ، يمكنني تحديد المستطيل اللازم للاحتفاظ بجميع الصور ، لذا فإن ما أريد القيام به الآن هو:
- قم بإنشاء نوع من المخزن المؤقت للاحتفاظ بالنتيجة (ما يعادل NS لما يسميه iPhoneOS UigraphicsContext.)
- ارسم جميع الصور في المخزن المؤقت.
- تعطل nsimage جديد من النتيجة المؤسسة للمخزن المؤقت.
في iPhoneOS ، هذا هو الرمز الذي يفعل ما أريد:
UIGraphicsBeginImageContext (woSize);
CGContextRef ctx = UIGraphicsGetCurrentContext();
[[UIColor clearColor] set];
CGContextFillRect(ctx, NSMakeRect(0, 0, woSize.width, woSize.height));
// draw my various images, here.
// i.e. Various repetitions of [myImage drawAtPoint:somePoint];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
ما أبحث عنه هو كيفية القيام بذلك في سطح المكتب Cocoa/NS.
شكرًا!
المحلول
NSImage* resultImage = [[[NSImage alloc] initWithSize:imageSize] autorelease];
[resultImage lockFocus];
[anotherImage drawAtPoint:aPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
// Or any of the other about 6 options; see Apple's guide to pick.
[resultImage unlockFocus];
الشيك دليل رسم Apple لأطول ، إجابة أكثر تفصيلا.
نصائح أخرى
#import <Cocoa/Cocoa.h>
@interface CompositeView : NSView {
NSImage *bottom;
NSImage *top;
}
- (IBAction)takeBottomFrom: (id)aView;
- (IBAction)takeTopFrom: (id)aView;
@end
#import "CompositeView.h"
@implementation CompositeView
- (IBAction)takeBottomFrom: (id)aView
{
id img = [[aView image] retain];
[bottom release];
bottom = img;
[self setNeedsDisplay: YES];
}
- (IBAction)takeTopFrom: (id)aView
{
id img = [[aView image] retain];
[top release];
top = img;
[self setNeedsDisplay: YES];
}
- (void)drawRect:(NSRect)rect
{
NSCompositingOperation op = 0;
NSRect bounds = [self bounds];
NSSize imageSize = bounds.size;
imageSize.width /= 7;
imageSize.height /= 2;
NSRect bottomRect = { {0,0}, [bottom size] };
NSRect topRect = { {0,0}, [top size] };
for (unsigned y=0 ; y<2 ; y++)
{
for (unsigned x=0 ; x<7 ; x++)
{
NSRect drawRect;
drawRect.origin.y = y * imageSize.height;
drawRect.origin.x = x * imageSize.width;
drawRect.size = imageSize;
[bottom drawInRect: drawRect
fromRect: bottomRect
operation: NSCompositeCopy
fraction: 1];
[top drawInRect: drawRect
fromRect: topRect
operation: op++
fraction: 1];
}
}
}
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
@end
لا تنتمي إلى StackOverflow