3 Stimmen

Problem beim Beschneiden des UIImage mit CGContext?

Ich entwickle die einfache UIApplication, in der ich das UIImage (im .jpg-Format) mit Hilfe von CGContext zuschneiden möchte. Der bisher entwickelte Code lautet wie folgt:

CGImageRef graphicOriginalImage = [originalImage.image CGImage];

UIGraphicsBeginImageContext(originalImage.image.size);

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGBitmapContextCreateImage(graphicOriginalImage);

CGFloat fltW = originalImage.image.size.width;
CGFloat fltH = originalImage.image.size.height;
CGFloat X = round(fltW/4); 
CGFloat Y =round(fltH/4);
CGFloat width = round(X + (fltW/2));
CGFloat height = round(Y + (fltH/2));   

CGContextTranslateCTM(ctx, 0, image.size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGRect rect = CGRectMake(X,Y ,width ,height); 
CGContextDrawImage(ctx, rect, graphicOriginalImage);

croppedImage = UIGraphicsGetImageFromCurrentImageContext();

return croppedImage;

} Der obige Code funktioniert gut, aber er kann das Bild nicht zuschneiden. Der Speicher des Originalbildes und der zugeschnittene Bildspeicher sind gleich (gleich dem Speicher des Originalbildes). Ist der obige Code richtig, um das Bild zuzuschneiden??????????????????

15voto

cduck Punkte 2651

Hier ist eine gute Möglichkeit, ein Bild zu einem CGRect zuzuschneiden:

- (UIImage*)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)rect
{
   // Erstellen eines Kontexts zum Ausschneiden
   UIGraphicsBeginImageContext(rect.size);
   CGContextRef currentContext = UIGraphicsGetCurrentContext();

   // Erstellen eines Rechtecks mit der gewünschten Bildgröße zum Zuschneiden
   // Das X und Y hier sind null, damit wir am Anfang unseres neu erstellten Kontexts starten
   CGRect clippedRect = CGRectMake(0, 0, rect.size.width, rect.size.height);
   CGContextClipToRect( currentContext, clippedRect);

   // Erstellen eines Rechtecks mit der vollen Bildgröße
   // Das Rechteck wird um die X- und Y-Position verschoben, von der aus wir den Zuschnitt starten möchten, um alles davor abzuschneiden
   CGRect drawRect = CGRectMake(rect.origin.x * -1,
                                rect.origin.y * -1,
                                imageToCrop.size.width,
                                imageToCrop.size.height);

   // Zeichnen des Bildes in unseren beschnittenen Kontext mit unserem verschobenen Rechteck
   CGContextDrawImage(currentContext, drawRect, imageToCrop.CGImage);

   // Das Bild aus unserem beschnittenen Kontext extrahieren
   UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext();

   // Den Kontext beenden, um zum Standard zurückzukehren
   UIGraphicsEndImageContext();

   // Hinweis: Dies ist automatisch freigegeben
   return cropped;
}

Oder auf eine andere Weise:

- (UIImage *)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)rect {
  CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect);
  UIImage *cropped = [UIImage imageWithCGImage:imageRef];
  CGImageRelease(imageRef);

  return cropped;
}

Von http://www.hive05.com/2008/11/crop-an-image-using-the-iphone-sdk/.

-1voto

Laurent Etiemble Punkte 26361

Der Kontext, den Sie erstellen, um das Bild zu zeichnen, hat die gleiche Größe wie das Originalbild. Deshalb haben sie die gleiche Größe.

Wenn Sie nicht das Rad neu erfinden möchten, werfen Sie einen Blick auf das TouchCode Projekt auf Google Code. Dort finden Sie UIImage-Kategorien, die den Job erledigen (siehe UIImage_ThumbnailExtensions.m)).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X