ASObjC: Klasse hinzufügen

Der erste Schritt war nicht schwer. Als nächsten kleinen Schritt fügen wir eine neue Klasse hinzu.

Im linken Bereich „Groups & Files“ des Projektbaumes legen wir mit einem Rechtsklick „Add > New File…“ eine neue AppleScriptObjC Klasse an.

Im nächsten Dialog wird „AppleScript class“ ausgewählt.

Im letzten Schritt wird noch der Dateiname angegeben. Benennen wir diesen einfach mal „controller.applescript“.

-- controller.applescript
-- asoc_01

-- Created by Christian Sonntag on 11.04.10.
-- Copyright 2010 __MyCompanyName__. All rights reserved.

script controller
  property parent : class "NSObject"

end script

So sieht nun eine AppleScriptObjC Klasse aus. Eigentlich unspektakulär, das einzige was aufföllt ist property parent : class „NSObject“.

Diese ASOC Klasse erbt alle Eigenschaften von NSObject. AppleScript Datentypen werden automatisch durch die ASOC-Bridge in Objective C Klassen konvertiert. Im umgekehrten Weg ist das nicht der Fall.

Werden Objective C Objekte an AppleScript zurückgegeben werden diese nicht in AS Datentypen umgewandelt. Dies hat den Vorteil dass dann weiterhin ObjC Methoden darauf angewendet werden können.

Update 26.07.2010: Unter Xcode 4 fehlt leider das ASObjC Template um eine Klasse anzulegen. Entweder man erstellt einen passende Datei von Hand, oder lädtsich ein Ersatztemnplate von www.macosxautomation.com.

ASObjC: Basic Xcode Projekt

So, wir fangen jetzt mal ganz sachte an und legen das erste AppleScriptObjC Projekt mit XCode an.

XCode starten, je nach Konfiguration erwartet einem das „Welcome to XCode“ Fenster und wir klicken auf „Create a new XCode project“. Falls nicht denke ich ist der Weg über Menü „File > New Project…“ nicht schwer zu finden.

Im folgenden Dialog wöhlt man unter Mac OS X > Application > Cocoa-AppleScript Application. Nach „Choose…“ wöhlt man noch den Namen der Application und den gewünschten Speicherort des Projekts.

Das Projekt ist angelegt. Zu sehen ist die Basis für eine ASOC Application. Auf den ersten Blick sieht dieses wie ein ganz normale Cocoa Application Projekt aus.

Die einzigen Resourcen die ein ASOC Projekt erahnen lassen sind das AppleScriptObjC.framework und die Datei „ProjektNameAppDelegate.applescript„. In dieser sind die beiden Methoden applicationWillFinishLaunching_ undapplicationShouldTerminate_, die beim Start oder beim beenden einer ASOC Application ausgeführt werden.

Das war es fürs erste. Das Projekt kann kompiliert und gestartet werden.

Objective-C: convert UIImage to greyscale

- (UIImage *)convertImageToGrayScale:(UIImage *)image
{
	// Create image rectangle with current image width/height
	CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);

	// Grayscale color space
	CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();

	// Create bitmap content with current image size and grayscale colorspace
	CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, colorSpace, kCGImageAlphaNone);

	// Draw image into current context, with specified rectangle
	// using previously defined context (with grayscale colorspace)
	CGContextDrawImage(context, imageRect, [image CGImage]);

	// Create bitmap image info from pixel data in current context
	CGImageRef imageRef = CGBitmapContextCreateImage(context);

	// Create a new UIImage object  
	UIImage *newImage = [UIImage imageWithCGImage:imageRef];

	// Release colorspace, context and bitmap information
	CGColorSpaceRelease(colorSpace);
	CGContextRelease(context);
	CFRelease(imageRef);

	// Return the new grayscale image
	return newImage;
}

Objective-C: resize UIImage proportional

//the following is appropriate call to do this if img is the UIImage instance.
//img=[img scaleProportionalToSize:CGSizeMake(320, 480)];

@interface UIImage (UIImageFunctions)
	- (UIImage *) scaleToSize: (CGSize)size;
	- (UIImage *) scaleProportionalToSize: (CGSize)size;
@end
@implementation UIImage (UIImageFunctions)

- (UIImage *) scaleToSize: (CGSize)size
{
	// Scalling selected image to targeted size
	CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
	CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
	CGContextClearRect(context, CGRectMake(0, 0, size.width, size.height));

	if(self.imageOrientation == UIImageOrientationRight)
	{
		CGContextRotateCTM(context, -M_PI_2);
		CGContextTranslateCTM(context, -size.height, 0.0f);
		CGContextDrawImage(context, CGRectMake(0, 0, size.height, size.width), self.CGImage);
	}
	else
		CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), self.CGImage);

	CGImageRef scaledImage=CGBitmapContextCreateImage(context);

	CGColorSpaceRelease(colorSpace);
	CGContextRelease(context);

	UIImage *image = [UIImage imageWithCGImage: scaledImage];

	CGImageRelease(scaledImage);

	return image;
}

- (UIImage *) scaleProportionalToSize: (CGSize)size1
{
	if(self.size.width>self.size.height)
	{
		NSLog(@"LandScape");
		size1=CGSizeMake((self.size.width/self.size.height)*size1.height,size1.height);
	}
	else
	{
		NSLog(@"Potrait");
		size1=CGSizeMake(size1.width,(self.size.height/self.size.width)*size1.width);
	}

	return [self scaleToSize:size1];
}

@end

Objective-C: load/create UIImage from URL and resize

NSString* imageURL = [NSString stringWithFormat: @"http://theimageurl.com/?id=%@", [[resultsEntries objectAtIndex:0] objectForKey: @"image_large"]];
NSData* imageData = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:imageURL]];
UIImage* image = [[UIImage alloc] initWithData:imageData];

// resize image
CGSize newSize = CGSizeMake(100, 100);
UIGraphicsBeginImageContext( newSize );// a CGSize that has the size you want
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

//image is the original UIImage
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

imageHeight = image.size.height;
[imageMain setImage:newImage];
[imageData release];
[image release];