Skip to content

Instantly share code, notes, and snippets.

@mralexgray
Created December 7, 2012 23:11
Show Gist options
  • Save mralexgray/4237383 to your computer and use it in GitHub Desktop.
Save mralexgray/4237383 to your computer and use it in GitHub Desktop.
Create Snapshot Images from Webpages in Cocoa
// MWWebSnapshot
//
// Created by Jim McGowan on 08/09/2010.
// Copyright 2010 Jim McGowan. All rights reserved.
//
// This code is made available under the BSD license.
// Please see the accompanying license.txt file
// or view the license online at http://www.malkinware.com/developer/License.txt
//
//
#import <Cocoa/Cocoa.h>
#import <WebKit/WebKit.h>
@interface MWWebSnapshot : NSObject
{
void (^completionBlock)(NSImage *image);
WebView *webView;
}
+ (void)takeSnapshotOfWebPageAtURL:(NSURL *)url completionBlock:(void (^)(NSImage *))block;
@end
@interface MWWebSnapshot()
- (id)_initWithCompletionBlock:(void (^)(NSImage *))block;
- (void)_beginDownloadFromURL:(NSURL *)url;
@end
@implementation MWWebSnapshot
+ (void)takeSnapshotOfWebPageAtURL:(NSURL *)url completionBlock:(void (^)(NSImage *))block;
{
MWWebSnapshot *instance = [[self alloc] _initWithCompletionBlock:block];
[instance _beginDownloadFromURL:url];
[instance autorelease];
}
- (id)_initWithCompletionBlock:(void (^)(NSImage *))block;
{
self = [super init];
if (self != nil)
{
completionBlock = [block copy];
webView = [[WebView alloc] initWithFrame:NSMakeRect(0.0, 0.0, 1000.0, 1000.0)
frameName:nil
groupName:nil];
[webView setFrameLoadDelegate:self];
}
return self;
}
- (void)_beginDownloadFromURL:(NSURL *)url;
{
[self retain];
[webView setMainFrameURL:[url absoluteString]];
}
- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
{
if (frame != [webView mainFrame])
{
return;
}
NSView *webFrameViewDocView = [[[webView mainFrame] frameView] documentView];
NSRect cacheRect = [webFrameViewDocView bounds];
NSBitmapImageRep *bitmapRep = [webFrameViewDocView bitmapImageRepForCachingDisplayInRect:cacheRect];
[webFrameViewDocView cacheDisplayInRect:cacheRect toBitmapImageRep:bitmapRep];
NSSize imgSize = cacheRect.size;
if (imgSize.height > imgSize.width)
{
imgSize.height = imgSize.width;
}
NSRect srcRect = NSZeroRect;
srcRect.size = imgSize;
srcRect.origin.y = cacheRect.size.height - imgSize.height;
NSRect destRect = NSZeroRect;
destRect.size = imgSize;
NSImage *webImage = [[[NSImage alloc] initWithSize:imgSize] autorelease];
[webImage lockFocus];
[bitmapRep drawInRect:destRect
fromRect:srcRect
operation:NSCompositeCopy
fraction:1.0
respectFlipped:YES
hints:nil];
[webImage unlockFocus];
NSSize defaultDisplaySize;
defaultDisplaySize.height = 64.0 * (imgSize.height / imgSize.width);
defaultDisplaySize.width = 64.0;
[webImage setSize:defaultDisplaySize];
completionBlock(webImage);
[self autorelease];
}
- (void)dealloc
{
[completionBlock release];
[webView release];
[super dealloc];
}
@end
@Jeannot-Muller
Copy link

This looks amazing. I cleansed the code to make ARC work, but I have issues how to call "takeSnapshotOfWebPageAtURL" out of my main program. I am quite new to Objective-C and I obviously have issues how to call the completion block part, or how to define that return value. Any help much appreciated!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment