2015-01-21 8 views
1

, 그것은 다음과 같이 두 개의 사진을 각각의 두 행과 더불어, 1000x500 사진이 될 것이다, 그래서 나는 타일에 노력하고 500x250으로 픽셀을 말할 수 CIAffineTile with Cocoa (이 필터가 가장 적합한 필터인지는 잘 모르겠다.)로 할 수있다.코코아에서 CIAffineTile을 사용하는 방법은 무엇입니까? 내가 노력하고</p> <p><img src="https://i.stack.imgur.com/cbdrf.png" alt="enter image description here"></p> <p>을 : 내가 CIImage이

예상대로 Apple의 문서는 매우 모호하고 암호화되어 있습니다. 분명히 필터가 iOS 및 OSX하지만 OSX 부분에서 다르게 호출해야

enter image description here

는 수수께끼이다. 내가 두 번 각 방향으로 + 2의 사진 크기는, 그들 사이에 2 픽셀 공간을 생성하는 작물보다 타일 필터를 생성,

내가 할 무엇인가

는 내가 가지고있는 코드입니다.

// the picture has to translate this amount? 
    CGAffineTransform translate = CGAffineTransformMakeTranslation(pictureWidth+2, pictureHeight+2); 
    CIFilter *filterTile = [CIFilter filterWithName:@"CIAffineTile"]; 
    [filterTile setValue:[NSValue valueWithBytes:&translate 
             objCType:@encode(CGAffineTransform)] 
             forKey:@"inputTransform"]; 

    CIVector *cropRect =[CIVector vectorWithX:0 
              Y:0 
              Z:2 * pictureWidth+2 
              W:2 * pictureHeight+2]; 

    CIFilter *crop = [CIFilter filterWithName:@"CICrop"]; 
    [crop setValue:[filterTile outputImage] forKey:@"inputImage"]; 
    [crop setValue:cropRect forKey:@"inputRectangle"]; 

이 경우 잘못된 CIImage가 표시됩니다.

enter image description here

변환에 어떤 문제가 : 내가 볼 것은이 무엇입니까? 이미지가 타일로 변환해야하는 픽셀의 양을 가정하지 않았습니까?

가장 이상한 부분 : 변환은 아무거나 될 수 있습니다. 심지어 변환이 동일하고 결과도 동일합니다.

나는 OSX에 작업을 수행하는 방법을 생각하려고이 같은 상상 :

NSAffineTransform *translate = [NSAffineTransform transform]; 
    [translate translateXBy:(pictureWidth + 2) yBy:(pictureHeight + 2]; 

    CIFilter *filterTile = [CIFilter filterWithName:@"CIAffineTile"]; 
    [filterTile setValue:imagem forKey:@"inputImage"]; 

을하지만 현명한 (???) 이미지 회전 90도 카운터 시계에 끝났다.

답변

2

개념적으로이 같은 CIAffineTile 필터 생각할 수 :

  1. 타일 무한 X의 이미지와 Y는 아핀

을 감안할 때이 변환을 적용

  • image.extent.size
  • 을 사용하여 구현에서, 아핀은 이미지 타일들 사이의 갭에 어떠한 영향도 미치지 않을 것으로 예상되는 행동이다.

    이미지 사이에 추가 간격이 필요하면 CIAffineTile을 사용하기 전에 이미지를 흰색 픽셀로 채워야합니다. 이것은 여기

    [[i imageByCompositingOverImage:[CIImage imageWithColor:white]] imageByCroppingToRect:CGRectInset(i.extent,-1,-1)] 
    

    를 사용하여 수행 할 수있는 것은

    CGAffineTransform xform = CGAffineTransformIdentity; 
    NSValue *xformObj = [NSValue valueWithBytes:&xform objCType:@encode(CGAffineTransform)]; 
    
    image = [image imageByApplyingFilter:@"CIAffineTile" 
           withInputParameters:@{kCIInputTransformKey : xformObj} ]; 
    image = [image imageByCroppingToRect:CGRectMake(0,0, 2*pictureWidth, 2*pictureHeight)]; 
    
    +0

    이 확인 패딩없이 2 × 2 타일을 수행하는 코드이지만, 왜 이미지는 아핀 내가 어떻게해야합니까? 신원 경우에도 이동 나타납니다 첫 번째 이미지는 0,0에서 시작하여 양쪽 방향으로 타일링됩니다. 이미지가 이미 이동되었습니다. 내 마지막 사진 좀 봐. – SpaceDog

    +0

    FWIW,이 코드는 Simulator CGAffineTransform xform = CGAffineTransformIdentity; NSValue * xformObj = [NSValue valueWithBytes : & xform objCType : @encode (CGAffineTransform)]; 이미지 = [imageImageParameters : @ {kCIInputTransformKey : image = [image imageByCroppingToRect : CGRectMake (0,0,2 * pictureWidth + 2, 2 * pictureHeight + 2)]; –