2009-12-20 2 views
1

Je crée une application d'édition d'image pour iphone. Je voudrais permettre à l'utilisateur de choisir une image de la photothèque, l'éditer (niveaux de gris, sépia, etc.) et, si possible, sauvegarder dans le système de fichiers. Je l'ai fait pour choisir l'image (la chose la plus simple, comme vous le savez en utilisant imagepicker) et aussi pour créer l'image en niveaux de gris. Mais, je suis resté coincé avec sépia. Je ne sais pas comment l'appliquer. Est-il possible d'obtenir les valeurs de chaque pixel de l'image afin que nous puissions le faire varier pour obtenir les effets désirés. Ou y a-t-il d'autres méthodes possibles? pls help ...Édition d'image en utilisant l'iphone

Répondre

1

Le code du sélecteur d'image Apple contiendra très probablement uniquement les noms de fichiers et certains rendus à plus basse résolution des images dans la mémoire vive jusqu'au dernier moment où un utilisateur sélectionne une image.

Lorsque vous demandez la mémoire tampon pleine trame de l'image, la CPU a soudainement faire beaucoup plus de décodage travail l'image à pleine résolution, mais il est peut-être même aussi simple que cela pour déclencher hors service:

CFDataRef CopyImagePixels(CGImageRef inImage) 
{ 
    return CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 
} 

/* IN MAIN APPLICATION FLOW - but see EDIT 2 below */ 
const char* pixels = [[((NSData*)CopyImagePixels([myImage CGImage])) 
    autorelease] bytes]; /* N.B. returned pixel buffer would be read-only */ 

Ceci est juste une supposition quant à la façon dont cela fonctionne, vraiment, mais basé sur une certaine expérience avec le traitement d'image dans d'autres contextes. Pour déterminer si ce que je suggère a du sens et est bon du point de vue de l'utilisation de la mémoire, exécutez Instruments.

Les documents d'Apple disent (liés, peut demander à vous):

Vous devriez éviter de créer des objets UIImage qui sont supérieures à 1024 x 1024 taille. Outre la grande quantité de mémoire qu'une telle image consommerait, vous pouvez rencontrer des problèmes lors de l'utilisation de l'image comme texture dans OpenGL ES ou lors du dessin de l'image sur une vue ou un calque. Cette restriction de taille ne s'applique pas si vous effectuez des manipulations basées sur le code, telles que le redimensionnement d'une image de taille supérieure à 1 024 x 1 024 pixels en l'attachant à un contexte graphique sauvegardé en mode point. En fait, vous devrez peut-être redimensionner une image de cette manière (ou la diviser en plusieurs petites images) afin de la dessiner sur l'une de vos vues. [http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIImage_Class/Reference/Reference.html]

ET

Note: Avant iPhone OS 3.0, les instances UIView peut avoir une hauteur et la largeur maximale de 1024 x 1024. Dans iPhone OS 3.0 et versions ultérieures, vues ne sont plus limités à ce maximum taille mais sont toujours limitées par la quantité de mémoire qu'ils consomment. Par conséquent, il est dans votre intérêt de garder les tailles de vues aussi petites que possible. Quelle que soit la version d'iPhone OS en cours d'exécution, vous devez envisager d'utiliser un objet CATiledLayer si vous devez créer des vues dont la taille est supérieure à 1024 x 1024. [http://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html]

A noter également: -

(a) officiel how-to

http://developer.apple.com/iphone/library/qa/qa2007/qa1509.html

(b) De http://cameras.about.com/od/cameraphonespdas/fr/apple-iphone.htm

« La taille de l'image téléchargée sur votre ordinateur est à 1600x1200, mais si vous envoyez la photo directement depuis l'iPhone, la taille sera réduite à 640x480. " (C) L'encodage de grandes images avec une compression d'image JPEG nécessite de grandes quantités de RAM, en fonction de la taille, éventuellement supérieure à celle disponible pour l'application. (D) Il peut être possible d'utiliser un autre algorithme de compression avec (si nécessaire) sa malloc recâblée pour utiliser des fichiers mappés en mémoire temporaire.Mais tenez compte des problèmes de confidentialité et de sécurité des données.

(e) De iPhone SDK: After a certain number of characters entered, the animation just won't load

« Je pense qu'il pourrait être un problème de taille de la couche, comme l'iPhone a une résolution de 1024 x 1024 limite de taille de texture (après quoi vous devez utiliser un CATiledLayer pour sauvegarder votre UIView), mais j'ai été capable de mettre en page un texte plus large que 1024 pixels et j'ai toujours ce travail. "

Parfois, la limite de 1024 pixels peut sembler être un peu mou, mais je vous suggère toujours de programmer de façon défensive et de rester dans la limite de 1024 pixels si vous le pouvez.

EDIT 1

rupture ajoutée ligne supplémentaire dans le code.

EDIT 2

Oops! Le code obtient une copie en lecture seule des données (il existe une différence entre CFMutableDataRef et CFDataRef). En raison des limitations sur la RAM disponible, vous devez alors en faire une copie plus basse en l'agrandissant vous-même, ou la copier dans un tampon modifiable, si l'image est grande, vous pourriez avoir besoin de l'écrire en bandes Dans un fichier temporaire, libérez le bloc de données non modifiable et chargez les données à partir du fichier. Et ne le faites bien sûr que si les données dans un fichier temporaire comme celui-ci est acceptable. Douloureux.

EDIT 3

est ici peut-être une meilleure idée peut-être essayer en utilisant un contexte bitmap de destination qui utilise un bloc CFData qui est un CFData mémoire mappée. Est-ce que ça marche? Encore une fois seulement le faire si vous êtes heureux avec les données passant par un fichier temporaire.

EDIT 4

Oh non, il semble que la mémoire mappée lecture-écriture CFData pas disponible. Peut-être essayer mmap API BSD. "lecture seule pixels" commentaire au code

EDIT 5

Ajouté "const char *" et.