[MUSIQUE JEU] ZAMYLA CHAN: Il a été Miss Scarlett avec le chandelier. Polar? Eh bien, nous allons le découvrir. Dans la Clue plateau de jeu, vous pourriez donner une image physique rouge. Et cette image est très rouge et tacheté, et votre travail consiste à révéler le message caché. Et généralement, vous êtes fourni avec un rouge loupe, ou un écran rouge révéler ce message caché. Eh bien, nous allons imiter cela. En polar, on vous donne une image bitmap qui semble très inégale et rouge, et puis exécutez le programme de polar pour révéler un message caché. Donc, nous allons briser ce en étapes. D'abord, vous voulez ouvrir le fichier - l'indice que vous avez reçu. Et puis aussi créer un fichier verdict bitmap. Alors, vous voulez mettre à jour le bitmap header info pour le fichier de sortie de verdict. Plus sur cela plus tard. Et puis vous allez lire dans le indice, ligne de balayage, pixel par pixel, changeant les couleurs de pixel comme nécessaire, et l'écriture ceux dans le verdict - pixel par pixel dans la verdict ligne de balayage. Comment pouvons-nous commencer à aller à ce sujet? Eh bien, heureusement, nous avons copy.c dans le code de distribution. Et cela va prouver très utile pour nous. Copy.c ouvre un fichier, lit en ce que l'en-tête de infile, puis met à jour le l'en-tête de fichier de sortie. Et puis il lit chaque pixel de l' ligne de balayage, pixel par pixel, et ensuite écrit ce pixel dans le fichier de sortie. Donc, votre première étape pourrait être à exécuter la commande suivante commande dans le terminal - cp copy.c whodunit.c. Cela va créer une copie de copy.c nommé whodunit.c. Donc, notre première étape pour ouvrir la fichier, ainsi, il ya une exacte réplique que dans copy.c. Donc, je vous laisse regarder ça. Ce que nous traitons dans ce PSET est fichier I / O, essentiellement en prenant fichiers, lecture, l'écriture, les modifier. Comment ouvrir d'abord un fichier? Eh bien, vous allez déclarer un fichier pointeur, puis vous appelez la fonction fopen. Passer dans le chemin, ou le nom de cette déposer, puis le mode que vous voulez pour ouvrir ce fichier po En passant une r ouvrira foo.bmp pour la lecture. Considérant que fopen avec passage dans un w sera bar.bmp ouvert, pour l'écriture du fichier et fait éditer. Alors, maintenant que nous avons ouvert le fichier, notre prochaine étape est de mettre à jour les informations d'en-tête pour le fichier de sortie. Qu'est-ce qu'un info-tête? Eh bien, nous devons d'abord savoir ce bitmap est. Une image bitmap est une simple arrangement d'octets. Et ils sont déclarés dans ce fichier ici, bmp.h, avec un groupe de informations de ce qu'est un bitmap est en fait constituée de. Mais ce que nous nous soucions vraiment est la en-tête de fichier bitmap, ici, et les informations en-tête bitmap, ici. L'en-tête est composé d'un couple de variables qui se révélera très utile. Il est biSizeImage, qui est le la taille totale de l'image en octets. Et cela inclut pixels et le rembourrage. Rembourrage est très important, mais nous y reviendrons plus tard. BiWidth représente la largeur de l' l'image en pixels moins le rembourrage. BiHeight est alors aussi la hauteur de l'image en pixels. Et puis la BITMAPFILEHEADER et la BITMAPINFOHEADER, comme je l'ai plus tôt, ceux-ci sont représentés comme structures. Donc, vous ne pouvez pas accéder à l'en-tête de fichier lui-même, mais vous aurez envie d'obtenir de ces variables à l'intérieur. OK. Alors, comment pouvons nous mettre à jour les informations d'en-tête? Eh bien, nous devons d'abord voir si nous besoin de modifier les informations de infile, la clé, à la outfile, le verdict. Est en train de changer quoi que ce soit dans ce cas? Eh bien, pas vraiment, parce que nous allons être juste changer les couleurs. Nous n'allons pas à modifier le fichier la taille, la taille de l'image, de la largeur, ou la hauteur. Donc, vous êtes d'accord pour l'instant par copiant simplement chaque pixel. OK. Alors maintenant, nous allons voir comment nous fait peut lire chaque pixel du fichier. Un autre fichier de fonctions I / O entreront en jeu - fread. Il faut dans un pointeur vers la struct qui contiendra les octets vous lisez. Alors que vous lisez en ce. Et puis vous passez à une taille, qui est la taille de chaque élément que vous envie de lire. Ici, la fonction sizeof vous sera utile. Ensuite, vous passez en nombre, qui représente le nombre d'éléments d' taille à lire. Et puis finalement, inptr, qui est le pointeur de fichier que vous êtes va lire. Donc, tous ces éléments sont à l'intérieur inptr et ils vont les données. Regardons un petit exemple. Si je veux lire en données deux chiens, bien, je peux le faire de deux façons. Je peux soit lu en deux objets de taille chien de mon inptr, ou je peux lire dans un objet de la taille de deux chiens. Donc, vous voyez que selon la manière que vous organisez taille et nombre, vous peut lire dans le même nombre d'octets. Alors maintenant, nous allons changer le couleur du pixel comme nous avons besoin. Si vous regardez bmp.h nouveau, puis vous verrez que au fond RGBTRIPLEs sont une autre structure, où ils sont composés de trois octets. Un, rgbtBlue, rgbtGreen, et rgbtRed. Donc, chacun de ces représente le montant de bleu, la quantité de vert, et le quantité de rouge à l'intérieur de ce pixel, où chaque montant est représenté par un nombre hexadécimal. Donc ff0000 seront de couleur bleue, car il va du bleu, au vert, au rouge. Et puis tout f de sera blanc. Jetons un coup d'oeil à smiley.bmp, qui vous avez dans votre code de distribution. Si vous l'ouvrez dans juste une image spectateur, alors vous aurez juste voir un smiley rouge. Mais en prenant une plongée profonde dans, nous allons voir que la structure il est juste de pixels. Nous avons pixels blancs, puis pixels rouges. Le blanc, ffffff, et puis tout d'un pixels rouges que j'ai coloré en pour vous ici, et vous voyez qu'ils sont 0000ff. Zéro bleu, vert zéro, et plein rouge. Et puisque smiley est de huit pixels de large, nous n'avons pas de rembourrage. Très bien. Donc, si je devais attribuer des valeurs différentes à un RGBTRIPLE et je voulais faire le vert, alors ce que je voudrais faire est Je voudrais déclarer un RGBTRIPLE, nommé triple, puis pour accéder à tous les octet à l'intérieur que je struct utiliserait l'opérateur point. Donc triple.rgbtBlue, je peux assignons à 0. Vert je peux assigner à plein - tout nombre, vraiment, entre 0 et ff. Et puis rouge, je vais aussi dire 0. Alors que me donne un pixel vert. Ensuite, si je veux vérifier la valeur de quelque chose? Je pourrais avoir quelque chose qui vérifie si la valeur de la triple rgbtBlue est ff et puis imprimez, «Je me sens bleu! ", à la suite. Maintenant, cela ne signifie pas nécessairement que le pixel est bleu, pas vrai? Parce que les valeurs vertes et rouges du pixel pourrait également avoir des non-valeurs 0. Tout cela signifie que, et tout ce qui ce vérifie pour est pour une couleur bleu plein. Mais tous les pixels pourraient également avoir partielle valeurs de couleurs, comme ce prochaine exemple ici. C'est un peu plus difficile à voir Qu'est-ce que l'image est maintenant. Cela ressemble un peu plus à l' clue.bmp que vous recevrez. Maintenant, physiquement, vous pouvez résoudre ce problème, parce qu'il ya beaucoup de rouge, par la tenue d'un écran rouge à l'image de sorte que les autres couleurs peuvent apparaître. Alors, comment pouvons-nous imitons ce avec c? Eh bien, nous pourrions supprimer tout rouge complètement de l'image. Et pour cela, nous avions mis tous les valeur de pixel rouge à 0. Et si l'image aurait l'air un peu peu comme cela, où nous n'avons pas rouge que ce soit. Nous pouvons voir le message caché un peu plus clair maintenant. C'est un autre visage souriant. Ou peut-être que nous pourrions utiliser une autre méthode. Peut-être, nous avons pu identifier tous les pixels rouges - c'est-à-tous les pixels avec 0 bleu, vert 0, et 0 rouge - et changer celles blanc. Et notre image peut sembler quelque chose comme ça. Un peu plus facile à voir. Il ya beaucoup d'autres manières de découvrir le message secret ainsi, traiter avec la manipulation de la couleur. Peut-être que vous pouvez utiliser l'une des méthodes que je l'ai mentionné ci-dessus. Et en plus, vous voudrez peut-être pour améliorer certaines couleurs et de traduire les sortir. Alors, maintenant que nous avons changé le pixel couleur, à côté nous avons juste besoin de les écrire pour la ligne de balayage, pixel par pixel. Et encore une fois, vous aurez envie de regarder en arrière à copy.c, si vous n'avez pas copié déjà, et de regarder la fwrite fonction, qui prend des données, un pointeur à la structure qui contient les octets que vous lisez à partir de la taille de les éléments, le nombre d'éléments, puis la outptr - la destination de ces fichiers. Après avoir écrit dans les pixels, vous aurez ont aussi écrire dans le rembourrage. Qu'est-ce que le rembourrage? Eh bien, chaque pixel de rgbt est de trois octets. Mais, la ligne de balayage pour une image bitmap doit être un multiple de quatre octets. Et si le nombre de pixels n'est pas un multiple de quatre, alors nous avons besoin d'ajouter ce remplissage. Le remplissage est juste représenté par des 0. Alors, comment allons-nous écrire, ou lire ce? Eh bien, il s'avère que vous ne pouvez pas rembourrage fait fread, mais vous pouvez calculer. Dans ce cas, l'idée et le verdict ont la même largeur, de sorte que le remplissage est le même. Et le rembourrage, comme vous le verrez dans copy.c, est calculée avec la formule ci-dessous - fois bi.biWidth sizeof (RGBTRIPLE) sera nous donner le nombre d'octets du bmp a dans chaque ligne. De là, le modulo et soustractions avec 4 peut calculer nombre d'octets doivent être ajoutés afin que le multiple d'octets sur chaque ligne est de quatre. Maintenant que nous avons la formule pour combien nous avons besoin de rembourrage, maintenant nous pouvons l'écrire. Maintenant, je l'ai dit avant, rembourrage est à 0. Donc, dans ce cas, nous sommes en train de mettre un char, dans ce cas un 0, dans notre outptr - notre fichier de sortie. Alors, ça peut juste être fputc 0, virgule outptr. Ainsi, alors que nous avons lu dans notre fichier, dossier I / O a gardé la trace de notre position dans ces fichiers avec quelque chose appelé l'indicateur de position de fichier. Pensez-y comme un curseur. Fondamentalement, elle avance à chaque fois que que nous FREAD, mais nous avons contrôle sur elle, aussi. Pour déplacer l'indicateur de position du fichier, vous pouvez utiliser la fonction fseek. Lorsque le inptr représente le fichier pointeur que vous êtes à la recherche dans le montant est le nombre d'octets que vous vouloir déplacer le curseur, puis de se rapporte à un point de référence d'où votre curseur se trouve. Si vous passez dans SEEK_CUR, que représente le courant position dans le fichier. Ou vous pouvez utiliser d'autres paramètres. Donc, nous pourrions utiliser fseek sauter sur le rembourrage du dossier dans. Et encore une fois, si vous êtes coincé, il ya un exemple de ce que dans copy.c. Alors maintenant, nous avons ouvert le fichier, l'indice, et le verdict. Nous avons mis à jour les informations d'en-tête pour notre verdict, parce que chaque bitmap a besoin d'une tête. Nous avons alors lisons dans la clé de ligne de balayage, pixel par pixel, en changeant toutes les couleurs en tant que de besoin, et écrit ceux dans le verdict, pixel par pixel. Une fois que vous ouvrez verdict, vous pouvez voir qui le coupable, ou quel est le secret message est. Mon nom est Zamyla, et c'était polar.