Re: Drawing over a QTCaptureView
Re: Drawing over a QTCaptureView
- Subject: Re: Drawing over a QTCaptureView
- From: "douglas a. welton" <email@hidden>
- Date: Sat, 7 Jun 2008 14:27:47 -0400
HI Gordon,
perhaps I'm missing something really basic (and if I am please set me
straight)...
Have you tried using CICrop to clip the CIImage? To me, that would
seem like a straightforward solution to your needs and get rid of any
conversion to an NSImage and back. Additionally, CIAffineTransform
seems like the ticket to accomplish your rotation and scaling needs or
CILanczosScaleTransform if you just need good scaling.
Hope that helps.
regards,
douglas
On Jun 6, 2008, at 1:08 PM, Gordon Apple wrote:
Here it is. There can be two capture views that use this (one
within
the main presentation window plus a miniature in the A/V inspector
panel),
or switch to one capture view in a separate video window. We hope to
eventually encode and stream same video.
I'd like to get control of the iSight camera to reduce its
resolution
since the displayed video is generally much smaller that my internal
iSight's 1280 x 1024. Lower frame rate would also be good.
If no clipping, the bezier returns nil and "clippedImage" returns
same
CIImage. Works great with no clipping, even with flipped/rotated
images.
BTW, if anyone knows how to get rid of the black background and
window
fill in a QTCaptureView, please let me know. I've tried about
everything --
setting opacity, fillcolor clear, etc.
I would also like to clip QTMovieView; I used to do this stuff in
MacOS
9 with sequence grabbers. I wish the QTKit stuff had an easy way to
do it.
- (CIImage*)clippedImage:(CIImage*)image {
NSRect rect = NSRectFromCGRect([image extent]);
NSBezierPath* clipPath = [self clipPathInRect:rect]; // Nil if
no
clipping.
if(clipPath == nil) return image; // Nothing to do.
NSImage *clippedImage = [[NSImage alloc] initWithSize:rect.size];
[clippedImage lockFocus];
[clipPath addClip];
[image drawAtPoint:NSZeroPoint fromRect:rect
operation:NSCompositeCopy
fraction:1.0f];
[clippedImage unlockFocus];
// Create CIImage from data (Better way to do this?)
CIImage * ciImage = [[CIImage alloc] initWithData:[clippedImage
TIFFRepresentation]];
return ciImage;
}
// Delegate of NSCaptureView
- (CIImage *)view:(QTCaptureView *)view willDisplayImage :(CIImage
*)image {
CIImage* newImage = image;
CIImage* returnImage = nil;
if([self usesTransform]) newImage = [image
imageByApplyingTransform:transform]; // 90 deg rotation and flips
-- not
used in trial.
{... Freeze/capture -- not used in trial}
returnImage = [self clippedImage:returnImage];
return returnImage;
}
Gordon,
Would you post a snippet of your code. I'm curious as to how you're
approaching this.
regards,
douglas
On Jun 5, 2008, at 9:26 PM, Gordon Apple wrote:
After receiving this, I tried something similar for clipping.
After I
cut in the filter, it worked for a few seconds, then slowed to
crawl, then
crashed. The images from the internal iSight are large. My theory
is that
all those NSImages (and associated caches) simply overwhelmed the
garbage
collector and eventually crashed it. There's got to be a better
way.
I thought about Keeping one NSImage, erasing it, and redrawing it
each
time, but the filter delegate gets used by more than one
QTCaptureView.
Ideally, the clipping should be done in the GPU and set up only
once.
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden