2016-06-30 1 views
10

は、私はすでに使用してドロー/ペイントを実装している:が描かれただけで、特定の領域の境界のためにUIImageを取得 - PaintView

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event 
-(void) touchesMoved: (NSSet *) touches withEvent: (UIEvent *) event 
- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event 

今の問題は、描かれた任意の行のために、私はその特定の行/ペイント画像を取得したいということです。私は画面全体のイメージ、ライン/ペイントの領域/境界のみ描画したくありません。

理由は、その行/ペイントされた描画でパンジェスチャー/削除機能を実行したいということです。

ユーザーは複数の線を描くことができるので、これらの線すべてに対して別々にUIImageが必要です。

任意のロジックやコードスニペットは

答えて

1

事前に

おかげで、あなたのアプリケーションに応じて、特にあなたが行でこれを行う上で計画して何回、あなたは別のを作成することができるかもしれ本当に参考になります各塗料ラインの画像/レイヤー。あなたの最終的なイメージは、本質的に、お互いの上に描かれたすべての個々の線です。

タッチイベントをキャプチャするカスタムビューを作成する方が効率的です。それぞれのペイントラインのタッチ座標のリストを保存し、それらをすべてカスタムdrawRectに一度にレンダリングすることができます。この方法では、各ペイントラインの座標リストを保存していますが、画像リストではなく、それぞれのペイントラインにアクセスできます。線を描画するために使用される座標から面積/境界を計算することができます。

追加のコンテキストとコードが役立つかもしれませんが、達成しようとしていることを完全に理解できていません。

+0

によって

return result; 

は、任意のコードスニペットは、あなたが自分自身や他の人ので、あなたのペイント/ドロー法を掲載場合には参考になる –

+0

参考になりますそれをより簡単に達成できるかもしれない。 – bradkratky

+0

私はこのライブラリを使用しています。https://github.com/megavolt605/MVPaint –

1

私はMVPaintプロジェクトを見ています。それはオブジェクトがあるようです:

MVPaintDrawing _drawing;

MVPaintTransactionの配列を含む。 MVPaintTransactionを反復してUIImageを描画することができます。

だから、最初のあなたはMVPaintTransactionから画像を取得するメソッドを追加することができます。

- (UIImage *) imageToDrawWithSize:(CGSize) size xScale:(CGFloat)xScale yScale:(CGFloat)yScale { 

    UIGraphicsBeginImageContext(size); 
    CGContextScaleCTM(UIGraphicsGetCurrentContext(), xScale, yScale); 

    // call the existing draw method  
    [self draw]; 

    UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return result; 
} 

その後MVPaintDrawingクラスのMVPaintTransactionの配列から画像の配列を取得するメソッドを追加:

- (NSArray *) getImagesFromDrawingOnSurface: (UIImageView *) surface xScale: (CGFloat) xScale yScale: (CGFloat) yScale{ 

    NSMutableArray *imageArray = [NSMutableArray new]; 
    for (MVPaintTransaction * transaction in _drawing) { 
     UIImage *image = [transaction imageToDrawWithSize:surface.frame.size xScale:xScale yScale:yScale]; 
     [imageArray addObject:image]; 
    } 

    return imageArray; 
} 

このようにして、描画した各行に対応するUIImageの配列が得られます。あなたはそれらのイメージは、「最小」の可能なサイズを(私は余分なアルファ部分なしで意味)にしたい場合は、this methodを適用することができます(私はMVPaintTransactionクラスでこれを追加しました):

- (UIImage *)trimmedImage:(UIImage *)img { 

    CGImageRef inImage = img.CGImage; 
    CFDataRef m_DataRef; 
    m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 

    UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef); 

    size_t width = CGImageGetWidth(inImage); 
    size_t height = CGImageGetHeight(inImage); 

    CGPoint top,left,right,bottom; 

    BOOL breakOut = NO; 
    for (int x = 0;breakOut==NO && x < width; x++) { 
     for (int y = 0; y < height; y++) { 
      int loc = x + (y * width); 
      loc *= 4; 
      if (m_PixelBuf[loc + 3] != 0) { 
       left = CGPointMake(x, y); 
       breakOut = YES; 
       break; 
      } 
     } 
    } 

    breakOut = NO; 
    for (int y = 0;breakOut==NO && y < height; y++) { 

     for (int x = 0; x < width; x++) { 

      int loc = x + (y * width); 
      loc *= 4; 
      if (m_PixelBuf[loc + 3] != 0) { 
       top = CGPointMake(x, y); 
       breakOut = YES; 
       break; 
      } 

     } 
    } 

    breakOut = NO; 
    for (int y = height-1;breakOut==NO && y >= 0; y--) { 

     for (int x = width-1; x >= 0; x--) { 

      int loc = x + (y * width); 
      loc *= 4; 
      if (m_PixelBuf[loc + 3] != 0) { 
       bottom = CGPointMake(x, y); 
       breakOut = YES; 
       break; 
      } 

     } 
    } 

    breakOut = NO; 
    for (int x = width-1;breakOut==NO && x >= 0; x--) { 

     for (int y = height-1; y >= 0; y--) { 

      int loc = x + (y * width); 
      loc *= 4; 
      if (m_PixelBuf[loc + 3] != 0) { 
       right = CGPointMake(x, y); 
       breakOut = YES; 
       break; 
      } 

     } 
    } 


    CGFloat scale = img.scale; 

    CGRect cropRect = CGRectMake(left.x/scale, top.y/scale, (right.x - left.x)/scale, (bottom.y - top.y)/scale); 
    UIGraphicsBeginImageContextWithOptions(cropRect.size, 
              NO, 
              scale); 
    [img drawAtPoint:CGPointMake(-cropRect.origin.x, -cropRect.origin.y) 
      blendMode:kCGBlendModeCopy 
       alpha:1.]; 
    UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    CFRelease(m_DataRef); 
    return croppedImage; 
} 

そして、単に第一の方法に置き換えます:

return [self trimmedImage:result]; 
+0

これは機能しません、私はあなたのコードを試しました –

+0

私はgetImagesFromDrawingOnSurfaceを呼び出すと、私はUIImageの配列を取得するイメージはあなたが求めるものである描かれた線を表す)。私のコードは、行を表示する方法を変更しません(これを行うには、例えばUIImageViewの配列を作成する必要があります)。 –

関連する問題