2013-07-03 9 views
6

Chcę ukryć obraz, przekazując inny obraz jako maskę. Mogę maskować obraz, ale wynikowy obraz nie wygląda dobrze. Jest postrzępiony na granicach.IOS: Maskowanie obrazu z zachowaniem współczynnika skali siatkówki na koncie

Zgaduję, że problem jest związany z grafiką siatkówki. Właściwość scale dla tych dwóch obrazów jest różna, ponieważ:

  1. Obraz, który chcę maskować, ma wartość skali 1. Ten obraz ma zazwyczaj rozdzielczość większą niż 1000x1000 pikseli.
  2. Obraz, zgodnie z którym chcę, aby wynikowy obraz (obrazek zawierający wyłącznie czarno-białe kolory) miał wartość skali 2. Ten obraz ma zwykle rozdzielczość 300 x 300 pikseli.

Uzyskany obraz ma wartość skalę 1.

Kod używam jest:

+ (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { 

CGImageRef maskRef = maskImage.CGImage; 

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
            CGImageGetHeight(maskRef), 
            CGImageGetBitsPerComponent(maskRef), 
            CGImageGetBitsPerPixel(maskRef), 
            CGImageGetBytesPerRow(maskRef), 
            CGImageGetDataProvider(maskRef), NULL, false); 


CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); 
CGImageRelease(mask); 
UIImage *maskedImage = [UIImage imageWithCGImage:masked ]; 
CGImageRelease(masked); 
return maskedImage; 
} 

Jak mogę uzyskać zamaskowany obraz, który podąża siatkówki skalę?

+0

Należy rozważyć sprawdzić poprawność odpowiedzi, jeśli ci pomogła. – kokluch

+0

Zadałem to pytanie 3 lipca 2013 r., A pierwsza odpowiedź miała miejsce w dniu 8 stycznia. Pomiędzy tymi godzinami przeniosłem się do różnych projektów i nie sprawdziłem, czy odpowiedź pomogła, a jeśli nie jestem pewna, to w jaki sposób mogę zaakceptować jakakolwiek odpowiedź. Chcę tylko zamknąć pytanie, ale nie wiem, jak to zrobić. –

+0

Trudno znaleźć ... – kokluch

Odpowiedz

5

Miałem ten sam problem. Wydaje się, że ta linia ignoruje współczynnik skali.

UIImage *maskedImage = [UIImage imageWithCGImage:masked]; 

Powinieneś więc narysować obrazek sam. Zastąp go następującym:

UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0); 

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height); 

CGContextDrawImage(context, rect, masked); 

UIImage * maskedImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

Działa dobrze przeze mnie.

EDIT

LUB

UIImage * maskedImage = [UIImage imageWithCGImage:masked 
              scale:[[UIScreen mainScreen] scale] 
             orientation:UIImageOrientationUp]; 
4

Można zrobić

UIImage * maskedImage = [UIImage imageWithCGImage:masked scale:[[UIScreen mainScreen] scale] orientation:UIImageOrientationUp];