2015-01-21 3 views
1

У меня есть CIImage, позволяет сказать, 500x250 пикселей, и я пытаюсь плитке его, так что он станет 1000x500 картинка, с двумя рядами двух снимков каждого, как это:Как использовать CIAffineTile на какао?

enter image description here

Я пытаюсь сделать это с помощью CIAffineTile на какао (я не уверен, что это самый подходящий фильтр для этого).

Как и ожидалось, документация, поступающая от Apple, ужасно расплывчата и зашифрована.

enter image description here

Видимо фильтр должен называться по-разному от прошивки и OSX, но части OSX загадочно.

Это код, у меня есть:

Что я делаю, я создаю плитка фильтр, чем обрезать его в два раза размер изображения в каждом направлении + 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
  2. применять аффинное преобразование

Учитывая это реализация, ожидается, что аффин не будет влиять на разрыв между фрагментами изображения.

Если вам нужен дополнительный промежуток между изображениями, вам нужно будет поместить изображение с белыми пикселями перед использованием CIAffineTile. Это может быть сделано с помощью

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

Вот код, который делает 2х2 плитку без дополнения

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

нормально, но почему изображение появляется сдвинуто, даже если аффинная тождественный? Как сделать первое изображение начинается с 0,0 и оттуда оттуда в обоих направлениях. Изображение уже сдвинуто. Посмотрите на мою последнюю фотографию. – SpaceDog

+0

FWIW, этот код работал для меня на симуляторе CGAffineTransform xform = CGAffineTransformIdentity; NSValue * xformObj = [Значение NSValueWithBytes: & xform objCType: @encode (CGAffineTransform)]; image = [image imageByApplyingFilter: @ "CIAffineTile" withInputParameters: @ {kCIInputTransformKey: xformObj}]; image = [image imageByCroppingToRect: CGRectMake (0,0,2 * pictureWidth + 2, 2 * pictureHeight + 2)]; –

Смежные вопросы