2011-10-31 8 views
4

thisの質問と同じことをしたいと思います。 私のアプリケーションでは、FaceBookで画像を切り抜くように画像をトリミングしたいのですが、チュートリアルやサンプルコードのリンクを教えてください。私が提供したリンクは私の要求を完全に記述する。iPhoneで画像を切り抜く方法

答えて

4

任意のプロパティで新しい画像を作成できます。ここに私の機能、魔女はそれを行う。新しい画像の独自のパラメータを使用するだけです。私の場合、画像は切り取られず、元の場所から別の場所にピクセルを移動するだけで効果があります。あなたは別の高さと幅の新しいイメージを初期化する場合は、あなただけの新しいものに、あなたが必要とする古い画像の画素の任意の範囲からコピーすることができます

-(UIImage *)Color:(UIImage *)img 
{ 
    int R; 
    float m_width = img.size.width; 
    float m_height = img.size.height; 
    if (m_width>m_height) R = m_height*0.9; 
    else R = m_width*0.9; 
    int m_wint = (int)m_width;  //later, we will need this parameters in float and int. you may just use "(int)" and "(float)" before variables later, and do not implement another ones 
    int m_hint = (int)m_height; 

    CGRect imageRect; 
    //cheking image orientation. we will work with image pixel-by-pixel, so we need to make top side at the top. 
    if(img.imageOrientation==UIImageOrientationUp 
     || img.imageOrientation==UIImageOrientationDown) 
    { 
     imageRect = CGRectMake(0, 0, m_wint, m_hint); 
    } 
    else 
    { 
     imageRect = CGRectMake(0, 0, m_hint, m_wint); 
    } 
    uint32_t *rgbImage = (uint32_t *) malloc(m_wint * m_hint * sizeof(uint32_t)); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(rgbImage, m_wint, m_hint, 8, m_wint *sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast); 
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
    CGContextSetShouldAntialias(context, NO); 
    CGContextTranslateCTM(context, 0, m_hint); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    switch (img.imageOrientation) { 
     case UIImageOrientationRight: 
     { 
      CGContextRotateCTM(context, M_PI/2); 
      CGContextTranslateCTM(context, 0, -m_wint);    
     }break; 
     case UIImageOrientationLeft: 
     { 
      CGContextRotateCTM(context, - M_PI/2); 
      CGContextTranslateCTM(context, -m_hint, 0);    
     }break; 
     case UIImageOrientationUp: 
     { 
      CGContextTranslateCTM(context, m_wint, m_hint); 
      CGContextRotateCTM(context, M_PI); 
     } 
     default: 
      break; 
    } 

    CGContextDrawImage(context, imageRect, img.CGImage); 
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 

    //here is new image. you can change m_wint and m_hint as you whant 
    uint8_t *result = (uint8_t *) calloc(m_wint * m_hint * sizeof(uint32_t), 1); 
    for(int y = 0; y < m_hint; y++) //new m_hint here 
    { 
     float fy=y; 
     double yy = (m_height*( asinf(m_height/(2*R))-asin(((m_height/2)-fy)/R) ))/
     (2*asin(m_height/(2*R))); // (xx, yy) - coordinates of pixel of OLD image 
     for(int x = 0; x < m_wint; x++) //new m_wint here 
     { 
      float fx=x; 
      double xx = (m_width*( asin(m_width/(2*R))-asin(((m_width/2)-fx)/R) ))/
      (2*asin(m_width/(2*R))); 
      uint32_t rgbPixel=rgbImage[(int)yy * m_wint + (int)xx]; 
      int intRedSource = (rgbPixel>>24)&255; 
      int intGreenSource = (rgbPixel>>16)&255; 
      int intBlueSource = (rgbPixel>>8)&255; 
      result[(y * (int)m_wint + x) * 4] = 0; 
      result[(y * (int)m_wint + x) * 4 + 1] = intBlueSource; 
      result[(y * (int)m_wint + x) * 4 + 2] = intGreenSource; 
      result[(y * (int)m_wint + x) * 4 + 3] = intRedSource; 

     } 
    } 

    free(rgbImage); 

    colorSpace = CGColorSpaceCreateDeviceRGB(); 
    context = CGBitmapContextCreate(result, m_wint, m_hint, 8, m_wint * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast ); //new m_wint and m_hint as well 


    CGImageRef image1 = CGBitmapContextCreateImage(context); 
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 
    UIImage *resultUIImage = [UIImage imageWithCGImage:image1]; 
    CGImageRelease(image1); 


    @try { 
     free(result); 
    } 
    @catch (NSException * e) { 
     NSLog(@"proc. Exception: %@", e); 
    } 

    return resultUIImage; 
} 
+0

ご回答をありがとうセンチネルをしかし、私は事あなたは私、私はコード 'CGRect cropRect = CGRectMake(100、100、200、200)のこのラインをやっている私の画像をトリミングしたい質問を取得できませんでした; \t CGImageRef imageRef = CGImageCreateWithImageInRect(ImageREF.CGImage、cropRect);このクロッピングはハードコードされていますが、この[link](http://img192.imageshack.us/)に示されているイメージリンクのRectを調整します。 img192/8930/customcropbox.jpg) –

+0

だから...あなたはちょうど画像をトリミングするためにrectを選択するために、ユーザーインターフェイスを作ることが欲しいですか?これは簡単です:ちょうどそこに動きに触れるを実装します。アルファ0.7の4つの白抜きバーは、切り抜かれる領域をミュートします。あなたは2つのタッチを扱うことができます:座標によると、それらがractangleの対角線の異なる側にあることを知って、あなたは簡単に4つの暗いバーのサイズを計算します。すべての動きでthamを変更してください。または、ワンタッチで:4つのスペース(青い円)が必要です。トラックをタッチしてそこに移動thamを移動する – SentineL

+0

あなたのための応答SansLと応答方法と私は私をガイドしています:) –

3

CGRect rectImage = CGRectMake(p1.x、p1.y 、p2.x-p1.x、p4.y-p1.y);

//Create bitmap image from original image data, 
//using rectangle to specify desired crop area 

CGImageRef imageRef = CGImageCreateWithImageInRect([imageForCropping CGImage], rectImage); 
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; 
imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(p1.x, p1.y,p2.x-p1.x p4.y-p1.y)]; 
imageView1.image = croppedImage; 
[self.view addSubview:imageView1]; 
CGImageRelease(imageRef); 
+1

ここでimageforcroppingは切り抜きたい画像です..そして切り取った部分を切り抜きたい画像 –

+0

どんな考え方画像が回転しているとき(つまり、iphoneカメラから撮影したとき)にこの作業を行いますか? –

+0

私はイメージをトリミングするときにイメージを回転させると思います!!!! –

関連する問題