2012-04-19 2 views
4

Je travaille actuellement sur une possibilité d'imprimer le contenu d'une vue via Airprint. Pour cette fonctionnalité, je crée un UIImage à partir de la vue et l'envoie à UIPrintInteractionController.Redimensionner UIImage pour UIPrintInteractionController

Le problème est que l'image est redimensionnée à la résolution maximale du papier et non sa taille d'origine (environ 300 x 500 pixels). Est-ce que quelqu'un sait comment créer une bonne page à partir de mon image.

Voici le code:

/** Create UIImage from UIScrollView**/ 
-(UIImage*)printScreen{ 
UIImage* img = nil; 

UIGraphicsBeginImageContext(scrollView.contentSize); 
{ 
    CGPoint savedContentOffset = scrollView.contentOffset; 
    CGRect savedFrame = scrollView.frame; 

    scrollView.contentOffset = CGPointZero; 
    scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height); 
    scrollView.backgroundColor = [UIColor whiteColor]; 
    [scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];  
    img = UIGraphicsGetImageFromCurrentImageContext(); 

    scrollView.contentOffset = savedContentOffset; 
    scrollView.frame = savedFrame; 
    scrollView.backgroundColor = [UIColor clearColor]; 
} 
UIGraphicsEndImageContext(); 
return img; 
} 

/** Print view content via AirPrint **/ 
-(void)doPrint{ 
if ([UIPrintInteractionController isPrintingAvailable]) 
{ 
    UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController]; 

    UIImage *image = [(ReservationOverView*)self.view printScreen]; 

    NSData *myData = [NSData dataWithData:UIImagePNGRepresentation(image)]; 
    if(pic && [UIPrintInteractionController canPrintData: myData]) { 

     pic.delegate =(id<UIPrintInteractionControllerDelegate>) self; 

     UIPrintInfo *printInfo = [UIPrintInfo printInfo]; 
     printInfo.outputType = UIPrintInfoOutputPhoto; 
     printInfo.jobName = [NSString stringWithFormat:@"Reservation-%@",self.reservation.reservationID]; 
     printInfo.duplex = UIPrintInfoDuplexNone; 
     pic.printInfo = printInfo; 
     pic.showsPageRange = YES; 
     pic.printingItem = myData; 
     //pic.delegate = self; 

     void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) { 
      if (!completed && error) { 
       NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code); 
      } 
     }; 

     [pic presentAnimated:YES completionHandler:completionHandler]; 

    } 

} 
} 

J'ai essayé de redimensionner l'image manuellement, mais cela ne fonctionne pas correctement.

+0

J'ai trouvé une solution non triviale et j'ai ajouté l'image à un fichier pdf auto-créé, mais j'aimerais savoir si c'est possibile sans fichier pdf. – AlexVogel

Répondre

1

J'ai trouvé ce code exemple sur Apple:

https://developer.apple.com/library/ios/samplecode/PrintPhoto/Listings/Classes_PrintPhotoPageRenderer_m.html#//apple_ref/doc/uid/DTS40010366-Classes_PrintPhotoPageRenderer_m-DontLinkElementID_6

Et il semble que la bonne façon de la taille d'une image pour l'impression (il ne remplit pas la page entière) est de mettre en œuvre votre propre UIPrintPageRenderer et mettre en œuvre:

- (void)drawPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)printableRect 

le printableRect vous indiquera la taille du papier et vous pouvez l'échelle vers le bas pour autant que vous voulez (probablement en calculant une certaine DPI).

Mise à jour: J'ai fini par mettre en œuvre ma propre ImagePageRenderer:

- (void)drawPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)printableRect 
{ 
    if(self.image) 
    { 
     CGSize printableAreaSize = printableRect.size; 

     // Apple uses 72dpi by default for printing images. This 
     // renders out the image to be giant. Instead, we should 
     // resize our image to our desired dpi. 
     CGFloat dpiScale = kAppleDPI/self.dpi; 

     CGFloat imageWidth = self.image.size.width * dpiScale; 
     CGFloat imageHeight = self.image.size.height * dpiScale; 

     // scale image if paper is too small 
     BOOL scaleImage = printableAreaSize.width < imageWidth || printableAreaSize.height < imageHeight; 
     if(scaleImage) 
     { 
      CGFloat widthScale = (CGFloat)printableAreaSize.width/imageWidth; 
      CGFloat heightScale = (CGFloat)printableAreaSize.height/imageHeight; 

      // Choose smaller scale so there's no clipping 
      CGFloat scale = widthScale < heightScale ? widthScale : heightScale; 

      imageWidth *= scale; 
      imageHeight *= scale; 
     } 

     // If you want to center vertically, horizontally, or both, 
     // modify the origin below. 

     CGRect destRect = CGRectMake(printableRect.origin.x, 
             printableRect.origin.y, 
             imageWidth, 
             imageHeight); 

     // Use UIKit to draw the image to destRect. 
     [self.image drawInRect:destRect]; 
    } 
    else 
    { 
     NSLog(@"no image to print"); 
    } 
} 
0
UIImage *image = [UIImage imageNamed:@"myImage"]; 
    [image drawInRect: destinationRect]; 
    UIImage *thumbnail = UIGraphicsGetImageFromCurrentImageContext(); 
UIImageWriteToSavedPhotosAlbum(image,nil,nil,nil); 

Le destinationRect sera dimensionné en fonction des dimensions de la version réduite.

Questions connexes