- (NSImage *)imageTintedWithColor:(NSColor *)tint
{
if (tint != nil) {
NSSize size = [self size];
NSRect bounds = { NSZeroPoint, size };
NSImage *tintedImage = [[NSImage alloc] initWithSize:size];
[tintedImage lockFocus];
CIFilter *colorGenerator = [CIFilter filterWithName:@"CIConstantColorGenerator"];
CIColor *color = [[[CIColor alloc] initWithColor:tint] autorelease];
[colorGenerator setValue:color forKey:@"inputColor"];
CIFilter *monochromeFilter = [CIFilter filterWithName:@"CIColorMonochrome"];
CIImage *baseImage = [CIImage imageWithData:[self TIFFRepresentation]];
[monochromeFilter setValue:baseImage forKey:@"inputImage"];
[monochromeFilter setValue:[CIColor colorWithRed:0.75 green:0.75 blue:0.75] forKey:@"inputColor"];
[monochromeFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputIntensity"];
CIFilter *compositingFilter = [CIFilter filterWithName:@"CIMultiplyCompositing"];
[compositingFilter setValue:[colorGenerator valueForKey:@"outputImage"] forKey:@"inputImage"];
[compositingFilter setValue:[monochromeFilter valueForKey:@"outputImage"] forKey:@"inputBackgroundImage"];
CIImage *outputImage = [compositingFilter valueForKey:@"outputImage"];
[outputImage drawAtPoint:NSZeroPoint
fromRect:bounds
operation:NSCompositeCopy
fraction:1.0];
[tintedImage unlockFocus];
return [tintedImage autorelease];
}
else {
return [[self copy] autorelease];
}
}
- (NSImage*)imageCroppedToRect:(NSRect)rect
{
NSPoint point = { -rect.origin.x, -rect.origin.y };
NSImage *croppedImage = [[NSImage alloc] initWithSize:rect.size];
[croppedImage lockFocus];
{
[self compositeToPoint:point operation:NSCompositeCopy];
}
[croppedImage unlockFocus];
return [croppedImage autorelease];
}
У меня есть только опыт вызова функций C или C ++ из MATLAB. Мне кажется, что единственная разница между вызовом функций в общей библиотеке и вызовом функций из MEX-файла заключается в том, что с общей библиотекой вы должны вызывать функцию с помощью 'calllib', которая является функцией типа командной строки, а функции MEX позволяют вы должны вызывать функции, как если бы они были встроенными, чтобы интерфейс был немного чище.
Я предлагаю использовать файлы MEX, если
Используйте разделяемую библиотеку, если
На самом деле все сводится к интерфейсу. Я лично предпочитаю путь к файлу MEX, потому что он обеспечивает самый чистый интерфейс от MATLAB к вашей функции C или C ++. Вы можете вызвать это как еще одну функцию со стандартными типами MATLAB. С общей библиотекой вам, возможно, придется отформатировать данные перед вызовом библиотечной функции
Я думаю, что методы, которые вы назвали, верны (я давно их не использовал)
C-компилятор Matlab на самом деле не особенный; можно использовать разные компиляторы. См. ссылку список поддерживаемых компиляторов. Это не включает gcc, но MS Visual Studio включена. Вы столкнетесь с проблемами при компоновке с поставляемыми библиотеками.
В основном: вызов Matlab из C - это то, что вы бы сделали, если вам нужен жесткий интерфейс; например, если вы хотите синхронизировать 2 инструмента, или ваша S-функция (simulink) требует дополнительной информации. Но тогда такой файл, вероятно, в первую очередь вызывается Matlab / simulink.
Вызов c из Matlab - это то, что вы хотите сделать, если вы пишете свои собственные S-функции или расширения для Matlab.
Выбор между C и C ++ за вами; если вы начинаете с чистого листа, я предлагаю вам использовать C ++; вам не нужно использовать полную функциональность, но это дает больше свободы. Также в настоящее время для C ++, как правило, доступно больше библиотек.
C - предпочтительный язык, если вам нужно перейти на очень разные среды; например, чтобы скомпилировать C для DSP. Или если у вас есть унаследованный код на C, с которого можно начать. Смешивание C и C ++ возможно, но это может быть немного громоздко; Я уверен, что вы найдете темы на StackOverflow только по этой теме.
Или если у вас есть устаревший код на C, с которого можно начать. Смешивание C и C ++ возможно, но это может быть немного громоздко; Я уверен, что вы найдете темы на StackOverflow только по этой теме. Или если у вас есть устаревший код на C, с которого можно начать. Смешивание C и C ++ возможно, но это может быть немного громоздко; Я уверен, что вы найдете темы на StackOverflow только по этой теме.