2016-07-18 4 views
0

comportement très bizarre, mais j'ai rétréci le problème vers le bas pour autant que je puis-je penserLors de la création d'un CGImage avec un tableau de décodage, la sortie a l'ensemble de ses pixels compensés par une petite quantité

J'ai NSImage, appelons-le inputImage. Il est représenté par un NSBitmapImageRep dans un CGColorSpaceCreateDeviceGray, si cela importe

Je veux créer un CGImageRef à partir de celui-ci, mais avec des couleurs inversées.

NSData *data = [inputImage TIFFRepresentation]; 
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); 

    NSBitmapImageRep *maskedRep = (NSBitmapImageRep*)[inputImage representations][0]; 
    CGFloat decode[] = {0.0, 1.0}; 

    maskRef = CGImageMaskCreate(maskedRep.pixelsWide, 
           maskedRep.pixelsHigh, 
           8, 
           maskedRep.bitsPerPixel, 
           maskedRep.bytesPerRow, 
           provider, 
           decode, 
           false); 

    NSImage *testImage = [[NSImage alloc] initWithCGImage:maskRef size:NSMakeSize(1280,1185)]; //the size of the image, hard-coded for testing 
    NSLog(@"testimage: %@", testImage); 

Le problème est quand je regarde testImage, tous les pixels sont légèrement décalés vers la droite de l'image originale.

inputImage:
enter image description here

testImage:
enter image description here

Il est beaucoup plus facile de voir si vous enregistrez les images hors, mais vous remarquerez que tout testImage est décalé vers la droite d'environ 5 pixels ou plus. Vous verrez un espace blanc à gauche du contenu noir dans testImage

Quelque part dans mes 5 lignes de code, je suis en quelque sorte déplacer mon image sur. Est-ce que quelqu'un a une idée de comment cela pourrait se produire? Je suspecte actuellement TIFFRepresentation

Répondre

2

Le fournisseur de données que vous transmettez à CGImageMaskCreate() est censé être des pixels bruts sous la forme spécifiée par les autres paramètres, pas un format de fichier image. Vous ne devriez pas transmettre de données TIFF. Franchement, je suis surpris que vous ayez quelque chose ressemblant à votre image originale, plutôt que du bruit/des ordures. Je suppose que les données TIFF n'ont pas été compressées, par pure chance. Vous pouvez réellement voir un peu de bruit, qui est l'en-tête TIFF interprété comme des pixels, en haut à gauche de votre masque.

Probablement, votre meilleur pari est de créer un CGImage de votre inputImage (ou, selon la façon dont inputImage a été créé, sauter NSImage et créer le CGImage directement à partir d'un fichier en utilisant l'API CGImageSource ou CGImageCreateWith{JPEG,PNG}DataProvider()). Pour obtenir un CGImage à partir d'un NSImage, utilisez -CGImageForProposedRect:context:hints:.

Ensuite, obtenir le fournisseur de données de ce CGImage et créer le masque CGImage de cela, en utilisant les différentes propriétés (largeur, hauteur, BPP, etc.) demande de la première CGImage en utilisant les différentes fonctions CGImageGet....

+0

Parfait merci! –