Kadrowanie obrazu z przezroczystością w iPhone

Pracuję nad grą typu Jigsaw, w której mam dwa obrazki do maskowania, Zaimplementowałem ten kod do maskowania

- (UIImage*) maskImage:(UIImage *)image withMaskImage:(UIImage*)maskImage {

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGImageRef maskImageRef = [maskImage CGImage];

    CGContextRef mainViewContentContext = CGBitmapContextCreate (NULL, maskImage.size.width, maskImage.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);

    if (mainViewContentContext==NULL)
        return NULL;

    CGFloat ratio = 0;
    ratio = maskImage.size.width/ image.size.width;
    if(ratio * image.size.height < maskImage.size.height) {
        ratio = maskImage.size.height/ image.size.height;
    } 

    CGRect rect1 = {{0, 0}, {maskImage.size.width, maskImage.size.height}};
    CGRect rect2  = {{-((image.size.width*ratio)-maskImage.size.width)/2,-((image.size.height*ratio)-maskImage.size.height)/2},{image.size.width*ratio, image.size.height*ratio}};

    CGContextClipToMask(mainViewContentContext, rect1, maskImageRef);
    CGContextDrawImage(mainViewContentContext, rect2, image.CGImage);

    CGImageRef newImage = CGBitmapContextCreateImage(mainViewContentContext);
    CGContextRelease(mainViewContentContext);

    UIImage *theImage = [UIImage imageWithCGImage:newImage];
    CGImageRelease(newImage);
    return theImage;
}

Tutaj wpisz opis obrazka

+

Tutaj wpisz opis obrazka

=

To jest ostateczny wynik, który otrzymałem po maskowaniu.

Tutaj wpisz opis obrazka

Teraz chciałbym przyciąć obraz w kawałku jak Tutaj wpisz opis obrazka i Tutaj wpisz opis obrazka i tak dalej parametrycznie (przyciąć obraz przez przezroczystość).

Jeśli ktoś wdrożył taki kod lub jakiś pomysł na ten scenariusz proszę podziel się.

Dzięki.

Używam tej linii kodu jako sugestii Guntisa Treulandsa ]}

int i=1;
    for (int x=0; x<=212; x+=106) {
        for (int y=0; y<318; y+=106) {
            CGRect rect = CGRectMake(x, y, 106, 106);
            CGRect rect2x = CGRectMake(x*2, y*2, 212, 212);

            UIImage *orgImg = [UIImage imageNamed:@"[email protected]"];
            UIImage *frmImg = [UIImage imageNamed:[NSString stringWithFormat:@"%[email protected]",i]];
            UIImage *cropImg = [self cropImage:orgImg withRect:rect2x];

            UIImageView *tmpImg = [[UIImageView alloc] initWithFrame:rect];
            [tmpImg setUserInteractionEnabled:YES];
            [tmpImg setImage:[self maskImage:cropImg withMaskImage:frmImg]];

            [self.view addSubview:tmpImg];
            i++;
        }
    }

OrgImg to oryginalny obraz kota, ramka frmImg do trzymania poszczególnych elementów, zamaskowana w Photoshopie, a cropImg to 106x106 przycinany obraz oryginału [email protected].

Moja funkcja kadrowania jest następująca

- (UIImage *) cropImage:(UIImage*)originalImage withRect:(CGRect)rect { 
    return [UIImage imageWithCGImage:CGImageCreateWithImageInRect([originalImage CGImage], rect)]; 
}
Author: iCoder86, 2012-05-30

1 answers

UPDATE 2

Byłem naprawdę ciekaw, jak znaleźć lepszy sposób na stworzenie układanki, więc spędziłem dwa weekendy i stworzyłem projekt demoukładanki .

Zawiera:

  • podaj liczbę kolumn/wierszy, a wygeneruje niezbędne elementy układanki o prawidłowej szerokości/wysokości. Im więcej kolumn / wierszy-tym mniejsza szerokość / wysokość i kontur/układanka w linii.
  • za każdym razem Generuj losowo strony
  • może losowo pozycjonować / obracanie elementów na początku startu
  • Każdy kawałek może być obracany przez stuknięcie lub dwoma palcami (jak prawdziwy kawałek) - ale po zwolnieniu przyciągnie się do 90/180/270/360 stopni]} Każdy element może być przesuwany po dotknięciu jego granicy "dotykowego kształtu" (który jest najczęściej tym samym widocznym kształtem puzzle, ale bez kształtów inline) [14]}

Wady:

  • brak sprawdzania, czy Element jest na swoim miejscu
  • jeśli więcej niż 100 sztuk-zaczyna się opóźniać, ponieważ, kiedy zbieramy kawałek, przechodzi on przez wszystkie podglądy, aż znajdzie właściwy kawałek.

UPDATE

Dzięki za zaktualizowane pytanie.

Udało mi się to zdobyć:

Tutaj wpisz opis obrazka

Jak widać - element jigsaw jest poprawnie przycięty i jest w kwadratowym imageView (Zielony kolor to UIImageView backgroundColor).

Więc - to co zrobiłem było:

CGRect rect = CGRectMake(105, 0, 170, 170); //~ location on cat image where second Jigsaw item will be.

UIImage *originalCatImage = [UIImage imageNamed:@"cat.png"];//original cat image

UIImage *jigSawItemMask = [UIImage imageNamed:@"JigsawItemNo2.png"];//second jigsaw item mask (visible in my answer) (same width/height as cat image.)

UIImage *fullJigSawItemImage = [jigSawItemMask maskImage:originalCatImage];//masking - so that from full cat image would be visible second jigsaw item

UIImage *croppedJigSawItemImage = [self fullJigSawItemImage withRect:rect];//cropping so that we would get small image with jigsaw item centered in it.

Do maskowania obrazków używam funkcji kategorii UIImage: (ale można chyba użyj funkcji maskowania. Ale i tak to opublikuję.)

- (UIImage*) maskImage:(UIImage *)image  
{     
     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

     UIImage *maskImage = self;
     CGImageRef maskImageRef = [maskImage CGImage];

     // create a bitmap graphics context the size of the image
     CGContextRef mainViewContentContext = CGBitmapContextCreate (NULL, maskImage.size.width, maskImage.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);


     if (mainViewContentContext==NULL)
          return NULL;

     CGFloat ratio = 0;

     ratio = maskImage.size.width/ image.size.width;

     if(ratio * image.size.height < maskImage.size.height) {
          ratio = maskImage.size.height/ image.size.height;
     } 

     CGRect rect1  = {{0, 0}, {maskImage.size.width, maskImage.size.height}};
     CGRect rect2  = {{-((image.size.width*ratio)-maskImage.size.width)/2 , -((image.size.height*ratio)-maskImage.size.height)/2}, {image.size.width*ratio, image.size.height*ratio}};


     CGContextClipToMask(mainViewContentContext, rect1, maskImageRef);
     CGContextDrawImage(mainViewContentContext, rect2, image.CGImage);


     // Create CGImageRef of the main view bitmap content, and then
     // release that bitmap context
     CGImageRef newImage = CGBitmapContextCreateImage(mainViewContentContext);
     CGContextRelease(mainViewContentContext);

     UIImage *theImage = [UIImage imageWithCGImage:newImage];

     CGImageRelease(newImage);

     // return the image
     return theImage;
}

POPRZEDNIA ODPOWIEDŹ

Czy możesz przygotować maskę do każdego kawałka?

Na przykład, masz ten obraz ramki. Czy można go wyciąć w Photoshopie w 9 oddzielnych obrazach, gdzie w każdym obrazie pokazywałby tylko odpowiedni kawałek. (cała reszta-usunąć).

Przykład - drugi element MasKi:

Tutaj wpisz opis obrazka

Następnie używasz każdego z tych nowo utworzonych obrazów maski na obrazie kota - każdy element zamaskuje wszystkie obraz, ale jeden pokój. W ten sposób będziesz miał 9 sztuk obrazów przy użyciu 9 różnych masek.

Dla większej lub innej klatki układanki-ponownie utwórz oddzielne maski obrazu.

Jest to podstawowe rozwiązanie, ale nie idealne, ponieważ musisz przygotować każdą maskę pokoju osobno.

Mam nadzieję, że to pomoże..
 17
Author: Guntis Treulands,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-23 13:21:43