tamaño - mi iphone cambio de color la pantalla
Recortar imagen con transparencia en iPhone (1)
Estoy trabajando en un juego tipo Jigsaw en el que tengo dos imágenes para enmascarar. He implementado este código para enmascarar.
- (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;
}
+
=
Este es el resultado final que obtuve después de enmascarar.
Ahora me gustaría recortar imagen en pieza como y y así sucesivamente de forma paramétrica (recortar una imagen por transparencia).
Si alguien ha implementado dicho código o alguna idea en este escenario, por favor, comparta.
Gracias.
Estoy usando esta línea de código para la sugerencia de Guntis Treulands
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 es una imagen original de gato, un marco frmImg para sujetar una pieza individual, enmascarada en photoshop y cropImg es una imagen recortada de 106x106 de [email protected] original.
Mi función para recortar es la siguiente
- (UIImage *) cropImage:(UIImage*)originalImage withRect:(CGRect)rect {
return [UIImage imageWithCGImage:CGImageCreateWithImageInRect([originalImage CGImage], rect)];
}
ACTUALIZACIÓN 2
Sentí mucha curiosidad por encontrar una mejor manera de crear un rompecabezas, así que pasé dos fines de semana y creé un proyecto de demostración de rompecabezas .
Contiene:
- proporcione el recuento de columnas / filas y generará las piezas de rompecabezas necesarias con el ancho / alto correcto. Cuantas más columnas / filas, menor será el ancho / alto y el contorno / forma de rompecabezas en línea.
- cada vez generar aleatoriamente lados
- Puede colocar / rotar aleatoriamente las piezas al comienzo del lanzamiento.
- cada pieza se puede girar con un toque o con dos dedos (como una pieza real), pero una vez liberada, se ajustará a 90/180/270/360 grados
- cada pieza se puede mover si se toca en su límite de "forma que se puede tocar" (que es en su mayoría la misma forma de rompecabezas visible, pero SIN formas en línea)
Inconvenientes:
- sin comprobar si la pieza está en su lugar correcto
- Si son más de 100 piezas, comienza a demorarse porque, al recoger una pieza, recorre todas las subvistas hasta que encuentra la pieza correcta.
ACTUALIZAR
Gracias por la pregunta actualizada.
Me las arreglé para conseguir esto:
Como puede ver, el elemento del rompecabezas está recortado correctamente y está en una imagen cuadrada (el color verde es UIImageView backgroundColor).
Entonces, lo que hice fue:
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.
Para el enmascaramiento de imágenes, estoy usando la función de categoría UIImage: (pero probablemente puedas usar tu función de enmascaramiento. Pero la publicaré de todos modos).
- (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;
}
RESPUESTA ANTERIOR
¿Se puede preparar una máscara para cada pieza?
Por ejemplo, tienes esa imagen de marco. ¿Puedes cortarlo en photoshop en 9 imágenes separadas, donde en cada imagen solo mostraría la pieza correspondiente? (todo lo demás - borrar).
Ejemplo - segunda pieza de máscara:
Luego utiliza cada una de estas imágenes de máscara recién creadas en la imagen del gato: cada pieza enmascarará toda la imagen, pero una sola paz. Así tendrás imágenes de 9 piezas usando 9 máscaras diferentes.
Para marcos de rompecabezas más grandes o diferentes, nuevamente, cree máscaras de imágenes separadas.
Esta es una solución básica, pero no perfecta, ya que necesita preparar cada máscara de paz por separado.
Espero eso ayude..