`
jsntghf
  • 浏览: 2511998 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

图片转场效果

    博客分类:
  • iOS
阅读更多

UniversalTransTestViewController.h

 

#import <UIKit/UIKit.h>
#import "ImageProcess.h"

#define KFrame	20

@class ImageProcess;
@interface UniversalTransTestViewController : UIViewController {
	UIImage *fromImage;
	UIImage *toImage;
	UIImage *ruleImage;
	UIImage *DestImage;
	UIImageView *drawImageView;
	
	ImageProcess *imgS1Proc;
	ImageProcess *imgS2Proc;
	ImageProcess *imgRuleProc;
	ImageProcess *imgDestProc;
	
	NSCondition	*timerCondition;
	unsigned char *pixelDataS1;			
	unsigned char *pixelDataS2;
	unsigned char *pixelDataRule;
	unsigned char *pixelDataDest;
	int	pixelPosition[480][320];
	int	bank[480][320];
	BOOL isRunning;
	
	NSTimer *timer;
	float countTime;
	int lim;
}

- (void)initImageView:(UIImage *)image;
- (void)setTransAtLayer:(int)index method:(NSString *)method time:(int)time rule:(NSString *)ruleImageName;
- (void)processImage;
@end

 

UniversalTransTestViewController.m

 

#import "UniversalTransTestViewController.h"

@implementation UniversalTransTestViewController

- (void)viewDidLoad {
	fromImage = [UIImage imageNamed:@"Car2.jpg"];
	toImage = [UIImage imageNamed:@"Car1.jpg"];
	DestImage = nil;
	isRunning = YES;
	timerCondition = [[NSCondition alloc]init];
	[self initImageView:fromImage];
	[self setTransAtLayer:0 method:@"universal" time:2000 rule:@"r2.png"];
}

- (void)initImageView:(UIImage *)image {
	drawImageView = [[UIImageView alloc] initWithImage:fromImage];
	drawImageView.frame = CGRectMake((self.view.bounds.size.width - fromImage.size.width) / 2,
									 (self.view.bounds.size.height - fromImage.size.height) / 2,
									 fromImage.size.width, fromImage.size.height);
	CGAffineTransform rotate = CGAffineTransformMakeRotation(-1.57);
	drawImageView.transform = rotate;
	[self.view addSubview:drawImageView];
	[drawImageView release];
}

- (void)setTransAtLayer:(int)index method:(NSString *)method time:(int)time rule:(NSString *)ruleImageName {
	if([method isEqualToString:@"universal"]) {
		ruleImage = [UIImage imageNamed:ruleImageName];
		countTime = 0;
		lim = 0;
		imgS1Proc = [[ImageProcess alloc] initWithImage:fromImage];
		imgS2Proc = [[ImageProcess alloc] initWithImage:toImage];
		imgRuleProc = [[ImageProcess alloc] initWithImage:ruleImage];
		imgDestProc = [[ImageProcess alloc] initWithImage:fromImage];
		pixelDataS1 = [imgS1Proc GetBegin];
		pixelDataS2 = [imgS2Proc GetBegin];
		pixelDataRule = [imgRuleProc GetBegin];
		pixelDataDest = [imgDestProc GetBegin];
		
		for (int i = 0; i < 480; i++)
			for (int j = 0; j < 320; j++) {
                pixelPosition[i][j] = (j * 480 + i) << 2;
                bank[i][j] = 0;
			}
		[NSThread detachNewThreadSelector:@selector(transImage) toTarget:self withObject:nil];
		timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(TimerClock:) userInfo:nil repeats:YES];
		[timer fire];
	}
}

- (void)TimerClock:(id)sender {
	[timerCondition broadcast];
}

- (void)transImage {
    isRunning = YES;
	while (countTime < 2300) {
		[timerCondition wait];
		lim += 255 / (2 * KFrame);
		[self processImage];
		countTime += 1000 / KFrame;
	}
	[timer invalidate];
	isRunning = NO;
}

- (void)processImage {
	NSLog(@"begin");
	
	for (int i = 0; i < 480; i++) {
		for (int j = 0; j < 320; j++) {
			if(bank[i][j] < 1) {
				int count = pixelPosition[i][j];
				if(pixelDataRule[count] < lim) {
					pixelDataDest[count] = pixelDataS2[count];
					pixelDataDest[count + 1] = pixelDataS2[count + 1];
					pixelDataDest[count + 2] = pixelDataS2[count + 2];
					bank[i][j]++;
				}
			}
		}
	}
    NSLog(@"end");
	if(DestImage != nil)
		[DestImage release];
	DestImage = [imgDestProc getImage];
	[self performSelectorOnMainThread:@selector(ChangeImage) withObject:nil waitUntilDone:NO];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
	static int num = 0;
	if(isRunning == NO) {
		countTime = 0;
		lim = 0;
		[imgDestProc release];
		imgDestProc = [[ImageProcess alloc] initWithImage:fromImage];
		for (int i = 0; i < 480; i++)
			for (int j = 0; j < 320; j++) {
				bank[i][j] = 0;
			}
		[imgRuleProc release];
		
		switch (num) {
			case 0:
				imgRuleProc = [[ImageProcess alloc] initWithImage:[UIImage imageNamed:@"r1.png"]];
				break;
			case 1:
				imgRuleProc = [[ImageProcess alloc] initWithImage:[UIImage imageNamed:@"r2.png"]];
				break;
			case 2:
				imgRuleProc = [[ImageProcess alloc] initWithImage:[UIImage imageNamed:@"r3.png"]];
				break;
			case 3:
				imgRuleProc = [[ImageProcess alloc] initWithImage:[UIImage imageNamed:@"r5.png"]];
				break;
			default:
				imgRuleProc = [[ImageProcess alloc] initWithImage:[UIImage imageNamed:@"r5.png"]];
				break;
		}
		num++;
		if(num > 3)
			num = 0;
		pixelDataRule = [imgRuleProc GetBegin];
		pixelDataDest = [imgDestProc GetBegin];
		[NSThread detachNewThreadSelector:@selector(transImage) toTarget:self withObject:nil];
		timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(TimerClock:) userInfo:nil repeats:YES];
	}
}

- (void)ChangeImage {
	[drawImageView setImage:DestImage];
}

- (void)dealloc {
	[imgS1Proc release];
	[imgS2Proc release];
	[imgRuleProc release];
	[imgDestProc release];
    [super dealloc];
}

@end

 

ImageProcess.h

 

#import <Foundation/Foundation.h>

@interface ImageProcess : NSObject {
	CGContextRef context;			// bitmap context
	unsigned char *pixelData;		// bitmap data pointer
	int width, height;				// bitmap width and height
}

- (id) initWithImage: (UIImage *) image;		// initialize and load image
- (unsigned char *)colorAtX:(int)x y:(int)y;	// get pixel color
- (unsigned char *)GetBegin;
- (UIImage *)getImage;							// get image
- (void)dealloc;								// dealloc
@end

 

ImageProcess.m

 

#import "ImageProcess.h"

@implementation ImageProcess

// create BitmapContext with UIImage and use 'pixelData' as the data pointer
- (id) initWithImage: (UIImage *) image {
	self = [super init];
	
	if(!self) {
		return nil;
	}
    
	CGColorSpaceRef colorSpace;
	int             bitmapByteCount;
	int             bitmapBytesPerRow;
	
	// bitmap settings
	context = NULL;
	width	= image.size.width;
	height	= image.size.height;
	bitmapBytesPerRow = (width * 4);
	bitmapByteCount = (bitmapBytesPerRow * height);
	
	// create color space
	colorSpace = CGColorSpaceCreateDeviceRGB();
	
	// create data pointer
	free(pixelData);
	pixelData = malloc(bitmapByteCount);
	
	// create bitmap context
	CGContextRelease(context);
	context = CGBitmapContextCreate (pixelData, width, height, 8, bitmapBytesPerRow,
									 colorSpace, kCGImageAlphaPremultipliedLast);
	CGColorSpaceRelease(colorSpace);
	
	// draw image data to context
	CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage);
	pixelData = CGBitmapContextGetData(context);
	
	return self;
}

- (unsigned char *)colorAtX:(int)x y:(int)y {
	return & (pixelData[(y * width + x) << 2]);
}

- (unsigned char *)GetBegin {
	return pixelData;
}

- (UIImage *)getImage {
	CGImageRef cgImg = CGBitmapContextCreateImage(context);
	UIImage *localImg = [[[UIImage alloc] initWithCGImage:cgImg] autorelease];
	CGImageRelease(cgImg);
	return localImg;
}

- (void)dealloc {
	[super dealloc];
	free(pixelData);
	CGContextRelease(context);
}

@end

 

示例图:


分享到:
评论

相关推荐

    图片转场特效

    在数字媒体制作和视频编辑领域,图片转场特效是一种常用的技术,用于在多个图像...而"图片特效2010-8-12"这个文件名可能是其中的一个示例文件,可能包含了2010年8月12日创建的一些图片转场效果实例,供用户学习和参考。

    图片 转场 特效 VB版

    【图片转场特效VB版】是一个使用Visual Basic(VB)编程语言实现的程序,它能够为图像添加过渡效果,使得在展示多张图片时产生平滑的视觉转换。VB是微软开发的一种面向对象的编程语言,它在Windows应用程序开发中...

    Flash图片转场特效.rar

    Flash图片转场特效,其实就是图片与图片交替显示进的过渡效果,加入了动画特效,这样看上去不至于那么单调。本转场特效是基于方块渐变型的效果,很动感。可广泛应用于基于Flash的图片展示、相册、焦点图幻灯片中。

    图片转场,图片过渡效果

    ' 程序数组 = { &从左往右推出效果, &从右往左推出效果, &从上往下推出效果, &从下往上推出效果, &从左边抽出效果, &从右边抽出效果, &从上边抽出效果, &从下边抽出效果, &从左上抽出效果, &从左下抽出效果, &从右...

    各种图片转场技巧和过渡特效

    在IT行业中,图片转场技巧和过渡特效是多媒体制作、软件开发和图形用户界面设计中的重要组成部分。这些技术主要用于创建视觉吸引力,使观众在不同图片或界面之间平滑过渡,增强用户体验。以下将详细探讨这一领域的...

    VB集成众多图片转场特效的电子相册代码.rar

    图片查看器,不过集成了20多种图片转场特效,支持以幻灯片方式播放图片,这些方式和Office PPT幻灯片软件中的方式十分相似,有渐变、淡入淡了、透明擦除、圆形透明擦除、溶解等动画效果,还可指定动画切换的方向,...

    很平滑的图片转场效果程序[Transition.rar]-精品源代码

    该资源是一个包含源代码的压缩包,名为"Transition.rar",专用于实现平滑的图片转场效果。在计算机编程领域,图片转场效果通常指的是在显示一组图像时,通过过渡动画来使得图像之间的切换更加自然和流畅。这种效果...

    xml控制图片转场代码

    用户可以通过打开这些文件来查看和学习如何在Flash环境中创建和实现XML控制的图片转场效果。 总的来说,通过XML控制图片转场,开发者可以实现动态、灵活且可扩展的图片切换效果,这在交互设计和富媒体应用中非常...

    gl-transtalte-图片转场

    gl-translatte 是一个专门用于实现这种效果的工具,它利用 OpenGL ES(一种跨平台的图形库)进行高效的图像处理,为用户提供了丰富的图片转场特效。 1. 图片转场基本概念: 图片转场是视觉设计中的关键元素,用于...

    android转场特效

    一、转场效果分类 1. **共享元素转场**(Shared Element Transition):这种转场允许两个Activity之间共享一个或多个视图元素,保持其在转场过程中的连续性,增强用户的感知。 2. **进入转场**(Enter Transition...

    多种jQuery图片转场切换效果演示.rar

    这个"多种jQuery图片转场切换效果演示.rar"压缩包包含了一系列利用jQuery实现的图片切换效果,对于网页设计师和前端开发者来说是一个非常有价值的资源。 首先,jQuery图片转场切换效果是网页焦点图或幻灯片展示的...

    Transitions-150组视频转场动画

    总的来说,这个资源包为AE用户提供了一套丰富的视频转场动画集合,方便他们在制作视频时快速添加高质量的转场效果,同时通过附加的图片、视频和链接,用户可以更全面地了解和掌握这些转场的应用。在实际使用过程中,...

    swift-Swift图片遮罩转场动画效果

    在Swift中,我们通常会使用UIView动画来实现转场效果。UIView动画提供了简单的API来创建平滑的动画,包括淡入淡出、缩放、旋转等。结合遮罩技术,我们可以在动画过程中改变遮罩的形状或位置,从而实现图片的动态变化...

    CSS3多种图片切换转场显示动画效果.rar

    CSS3多种图片切换转场显示动画效果,这实际上是一个网页焦点图特效,但这个焦点图的图片切换效果几乎不重复,每切换一次,切换的过渡转场特效都不一样,有淡入淡出渐变,有旋转渐变,有向上向下滑出,有重叠显示,有...

    60个转场音效

    标题表明这是一个包含60种不同转场效果的集合,适用于网页和Flash项目。转场音效在各种媒体作品中起到过渡和衔接的作用,提升用户体验,使得视觉和听觉内容更加流畅自然。 首先,让我们了解一下什么是转场音效。转...

    PR视频特效及视频转场特效中英文对照收集.pdf

    "PR视频特效及视频转场特效中英文对照收集.pdf" 本资源文件提供了Premiere Pro 2.0视频转场特效的英汉对照表,涵盖了10大类视频特效,包括3D过渡、溶解、圈入、映射、卷页、滑行、特技、伸展、擦除和变焦等。这些...

    图片转场特效VB版

    【标题】"图片转场特效VB版"是一个基于Visual Basic(VB)开发的程序,它实现了图像之间的转场效果,具体来说是模仿了百叶窗的动画过渡效果。这种效果在多媒体展示、幻灯片制作或者视频编辑中非常常见,能够增加视觉...

    OpenCV实现视频过渡效果(时钟擦、中心圆放大)

    用OpenCV实现两张图片的视频切换效果,包括时钟擦、中心圆放大的效果。 由于算法限制,速度较慢。 多媒体技术基础课程实验,仅供参考。

    PR视频特效及视频转场特效中英文对照表扫描.pdf

    Premiere Pro 2.0 视频转场特效英汉对照表 Premiere Pro 是一款功能强大的视频编辑软件,它提供了多种视频转场特效,帮助用户创建丰富多样的视频内容。下面是 Premiere Pro 2.0 视频转场特效的英汉对照表: 1. 3D ...

    易语言图片转场模块&例程源码,易语言图片效果转换

    易语言图片效果转换源码,图片效果转换,模块_随机显示效果,模块_推出效果之从左往右,模块_推出效果之从右往左,模块_推出效果之从上往下,模块_推出效果之从下往上,模块_抽出效果之从左边,模块_抽出效果之从右边,模块_...

Global site tag (gtag.js) - Google Analytics