convertir et redimensionner

tabliertablier Membre
18:56 modifié dans API AppKit #1
J'ai un problème classique en traitement d'image, et je n'ai pas tout compris!  :-\\
Je souhaite, à  partir d'images jpg, tif, gif ou png, obtenir pour chacune d'elles une image jpg et une vignette de dimensions définies.
J'ai lu ce qu'a écrit  BRU sur le redimensionnement, et aussi sur les NSImageRep. C'est un bon début de réponse, et j'ai cherché comment changer le type de l'image. Je pense que  representationUsingType:properties:  devrait convenir.

Je voudrais savoir si le principe ci-après vous parait correcte:

1 Charger l'image par imageRepWithContentsOfFile:  (Initialise une représentation dans une zone NSData ?).
2 Créer un  NSBitmapImageRep avec  imageRepsWithData: et sélectionner la +grande image (s'il y en a +sieurs).
3 Utiliser  representationUsingType:properties: pour obtenir un NSData par image souhaitée
4 Sauver les NSData dans les fichiers finaux avec les bons noms et extensions.

Ce que j'ai du mal à  voir, c'est à  quel niveau je doit redimensionner? je pense en 3!  Mais peut-être vaut-il mieux créer 1 NSBitImageRep pour chaque image souhaitée.

A noter que je souhaite que ça fonctionne aussi sous 10.3.0 ou à  défaut sous 10.3.9

Réponses

  • 18:56 modifié #2
    <br />NSString*	path = @&quot;Le Chemin De Ton Image Initiale;<br /><br />NSData*		imageData;<br />NSBitmapImageRep* imageRep;<br />	<br />NSImage* image = [[NSImage alloc] initWithContentsOfFile:path];<br />			<br />NSSize newSize;<br />newSize.width = laNouvelleLargeur;<br />newSize.height = laNouvelleHauteur;<br /><br />[image setScalesWhenResized:YES];<br />[image setSize:newSize];<br />	<br /><br /> NSImage *newImage;<br /> NSRect newRect, oldRect;<br /><br />&nbsp; &nbsp;newRect.origin=NSZeroPoint;<br />&nbsp; &nbsp;newRect.size=newSize;<br /><br />&nbsp; &nbsp;newImage=[[NSImage alloc] initWithSize: newRect.size];<br />&nbsp; <br />&nbsp; &nbsp;[newImage lockFocus];<br />&nbsp; &nbsp;[NSGraphicsContext saveGraphicsState];<br /><br /> <br />&nbsp; &nbsp;oldRect.origin=NSZeroPoint;<br />&nbsp; &nbsp;oldRect.size=[image size];<br /><br />&nbsp; &nbsp;[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];<br />&nbsp; &nbsp;[[NSGraphicsContext currentContext] setShouldAntialias:YES];<br /><br />&nbsp; &nbsp;[image drawInRect:newRect fromRect:oldRect operation:NSCompositeCopy fraction:1.0];<br /><br />&nbsp; &nbsp;[NSGraphicsContext restoreGraphicsState];<br />&nbsp; &nbsp;[newImage unlockFocus];<br /><br /><br />&nbsp; &nbsp;imageData = [newImage TIFFRepresentation];<br />&nbsp; &nbsp;imageRep = [NSBitmapImageRep imageRepWithData:imageData];<br />&nbsp; &nbsp;<br />&nbsp; &nbsp;imageData = [imageRep representationUsingType:NSJPEGFileType properties:nil];<br />	<br />&nbsp; &nbsp; [imageData writeToFile:LeCheminDeSauvegarde atomically:NO];<br />&nbsp; &nbsp; [newImage release];<br />&nbsp; &nbsp; [image release];<br />
    


    Voilà  comment je fais pour Resize 'Em All. (Et merci à  Bru)
  • Philippe49Philippe49 Membre
    18:56 modifié #3
    Avec le même code de Bru , o:)   qu'il en soit remercié à  tout jamais et dans les OS-siècles des OS--siècles o:) , j'avais simplement écrit sans bitmap Representation, et en respectant la proportionnalité :

    <br />NSImage * resizedImage(NSImage *image,NSSize newSize)<br />{<br />	// setProportionnaly	<br />	NSRect newRect, oldRect;	<br />	oldRect.origin=NSZeroPoint;<br />	oldRect.size=[image size];<br />	float ratio= [image size].height/[image size].width;<br />	if(ratio&gt;=1){<br />		newRect.size.height=newSize.height;<br />		newRect.size.width=newRect.size.height/ratio;<br />	} else {<br />		newRect.size.width=newSize.width;<br />		newRect.size.height=newRect.size.width*ratio;<br />	}	<br />	newRect.origin=NSZeroPoint;<br />	NSImage * thumbnail=[[NSImage alloc] initWithSize:newRect.size];<br />		<br />	// ouverture du port graphique de la petite image<br />	[thumbnail lockFocus];<br />	[NSGraphicsContext saveGraphicsState];<br />	// modif du port graphique<br />	[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];<br />	[[NSGraphicsContext currentContext] setShouldAntialias:YES];<br />	<br />	// dessin de la grande image dans la petite<br />	[image drawInRect:newRect fromRect:oldRect operation:NSCompositeCopy fraction:1.0];<br />	<br />	// fermeture du port graphique de la petite image<br />	[NSGraphicsContext restoreGraphicsState];<br />	[thumbnail unlockFocus];<br />	<br />	return [thumbnail autorelease];<br />}<br />
    


    Quelle est l'utilité des NSBitmapRepresentation dans ton code EagleLouk ?
  • 18:56 modifié #4
    à  obtenir le Data pour enregistrer l'image .. enfin j'ai toujours fait comme ça  :o
  • tabliertablier Membre
    18:56 modifié #5
    Oh grand saint saint BRU dessinez nos images, dessinez les bien!
    (sur l'air de oh grand saint symphorien....etc)

    Si j'ai bien compris les différents codes de BRU, Philippe49 et Eaglelook  (bons exemples!) on ne peut convertir et redimensionner une image sans passer par un dessin dans un rectangle.
    Je vais faire quelques essais!
      Merci pour les codes et les infos.  :P
  • psychoh13psychoh13 Mothership Developer Membre
    18:56 modifié #6
    Bah en fait tu dessines dans un context graphique qui a la forme... d'un rectangle. :D
    C'est comme si tu prenais une feuille de papier, qui représente ton context graphique, et qu'ensuite tu te mettais à  dessiner dessus.
Connectez-vous ou Inscrivez-vous pour répondre.