en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

6.01.2011

UIImage 的剪裁與複製

 

這裡 UIImage 的剪裁指的是矩形樣式的剪裁,如上圖,影像被剪裁城相同大小的方形區域,並以隨機的方式散落在畫面上,要裁切影像的方式非常簡單,其實只要設定好區域 CGRect 就可以了,其程式碼如下。

//設定原始影像
UIImage *originalImage = [UIImage imageNamed:@"icon.png"];

//設定剪裁影像的位置與大小
CGImageRef imageRef = CGImageCreateWithImageInRect([originalImage CGImage], CGRectMake(0, 0, originalImage.size.width / 4, originalImage.size.height / 4));

//剪裁影像
UIImage *copiedImage = [UIImage imageWithCGImage:imageRef];

CGImageRelease(imageRef);

//將剪裁的影像加至View中
UIImageView *imageView = [[UIImageView alloc] initWithImage:copiedImage];

//設定View的大小並秀出來
[imageView setFrame:CGRectMake(0, 0, copiedImage.size.width, copiedImage.size.height)];
[[self view] addSubview:imageView];

[imageView release];

上述程式碼掩飾了基本的剪裁過程,其剪裁的位置從左上角座標(0, 0)處開始,大小為四分之一的長與寬,最後要秀出影像的 View 大小也維持剪裁的大小,座標位置也是在左上角座標(0, 0)處。

程式碼到這裡只展示了剪裁一個區塊的程式碼,如果像要與本範例一樣的效果可以在撰寫時使用迴圈與亂數來達成,其程式碼如下。

//設定原始影像
UIImage *originalImage = [UIImage imageNamed:@"icon.png"];

//設定剪裁影像的大小
CGSize copiedImageSize = CGSizeMake(originalImage.size.width / 4, originalImage.size.height / 4);

for (int i=0; i!=30; i++) {
    int randomNUM_X = arc4random() % 192;
    int randomNUM_Y = arc4random() % 192;

    //設定剪裁座標
    CGImageRef imageRef = CGImageCreateWithImageInRect([originalImage CGImage], CGRectMake(randomNUM_X, randomNUM_Y, copiedImageSize.width, copiedImageSize.height));

    //剪裁影像
    UIImage *copiedImage = [UIImage imageWithCGImage:imageRef];

    CGImageRelease(imageRef);

    //將剪裁的影像加至View中
    UIImageView *imageView = [[UIImageView alloc] initWithImage:copiedImage];
    randomNUM_X = arc4random() % 256;
    randomNUM_Y = 46 + arc4random() % 400;

    //設定View的大小並秀出來
    [imageView setFrame:CGRectMake(randomNUM_X, randomNUM_Y, copiedImageSize.width, copiedImageSize.height)];
    [[self view] addSubview:imageView];

    [imageView release];
}

ps:如果是想要使用不規則的方式,則可以考慮以路徑繪出剪裁區域,或是直接使用影像當作剪裁區域再使用遮色片的方式來進行裁切。





沒有留言:

張貼留言