1 00:00:00,000 --> 00:00:09,500 >> [MUSIQUE JEU] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Il a été Miss Scarlett avec le chandelier. 3 00:00:12,350 --> 00:00:13,560 Polar? 4 00:00:13,560 --> 00:00:15,030 Eh bien, nous allons le découvrir. 5 00:00:15,030 --> 00:00:20,870 Dans la Clue plateau de jeu, vous pourriez donner une image physique rouge. 6 00:00:20,870 --> 00:00:24,120 Et cette image est très rouge et tacheté, et votre travail consiste à 7 00:00:24,120 --> 00:00:25,490 révéler le message caché. 8 00:00:25,490 --> 00:00:29,740 Et généralement, vous êtes fourni avec un rouge loupe, ou un écran rouge 9 00:00:29,740 --> 00:00:31,410 révéler ce message caché. 10 00:00:31,410 --> 00:00:33,340 Eh bien, nous allons imiter cela. 11 00:00:33,340 --> 00:00:37,960 >> En polar, on vous donne une image bitmap qui semble très inégale et rouge, 12 00:00:37,960 --> 00:00:43,430 et puis exécutez le programme de polar pour révéler un message caché. 13 00:00:43,430 --> 00:00:45,650 >> Donc, nous allons briser ce en étapes. 14 00:00:45,650 --> 00:00:50,390 D'abord, vous voulez ouvrir le fichier - l'indice que vous avez reçu. 15 00:00:50,390 --> 00:00:53,880 Et puis aussi créer un fichier verdict bitmap. 16 00:00:53,880 --> 00:00:58,240 Alors, vous voulez mettre à jour le bitmap header info pour le fichier de sortie de verdict. 17 00:00:58,240 --> 00:00:59,920 Plus sur cela plus tard. 18 00:00:59,920 --> 00:01:04,319 Et puis vous allez lire dans le indice, ligne de balayage, pixel par pixel, 19 00:01:04,319 --> 00:01:07,320 changeant les couleurs de pixel comme nécessaire, et l'écriture 20 00:01:07,320 --> 00:01:08,960 ceux dans le verdict - 21 00:01:08,960 --> 00:01:12,000 pixel par pixel dans la verdict ligne de balayage. 22 00:01:12,000 --> 00:01:13,780 >> Comment pouvons-nous commencer à aller à ce sujet? 23 00:01:13,780 --> 00:01:16,940 Eh bien, heureusement, nous avons copy.c dans le code de distribution. 24 00:01:16,940 --> 00:01:21,240 Et cela va prouver très utile pour nous. 25 00:01:21,240 --> 00:01:29,700 Copy.c ouvre un fichier, lit en ce que l'en-tête de infile, puis met à jour le 26 00:01:29,700 --> 00:01:31,070 l'en-tête de fichier de sortie. 27 00:01:31,070 --> 00:01:37,010 Et puis il lit chaque pixel de l' ligne de balayage, pixel par pixel, et ensuite 28 00:01:37,010 --> 00:01:42,390 écrit ce pixel dans le fichier de sortie. 29 00:01:42,390 --> 00:01:45,020 >> Donc, votre première étape pourrait être à exécuter la commande suivante 30 00:01:45,020 --> 00:01:46,420 commande dans le terminal - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Cela va créer une copie de copy.c nommé whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Donc, notre première étape pour ouvrir la fichier, ainsi, il ya une exacte 34 00:01:58,320 --> 00:02:00,070 réplique que dans copy.c. 35 00:02:00,070 --> 00:02:03,360 Donc, je vous laisse regarder ça. 36 00:02:03,360 --> 00:02:07,860 >> Ce que nous traitons dans ce PSET est fichier I / O, essentiellement en prenant fichiers, 37 00:02:07,860 --> 00:02:10,229 lecture, l'écriture, les modifier. 38 00:02:10,229 --> 00:02:12,650 Comment ouvrir d'abord un fichier? 39 00:02:12,650 --> 00:02:16,800 Eh bien, vous allez déclarer un fichier pointeur, puis vous appelez la 40 00:02:16,800 --> 00:02:18,670 fonction fopen. 41 00:02:18,670 --> 00:02:23,150 Passer dans le chemin, ou le nom de cette déposer, puis le mode que vous voulez 42 00:02:23,150 --> 00:02:24,700 pour ouvrir ce fichier po 43 00:02:24,700 --> 00:02:28,620 En passant une r ouvrira foo.bmp pour la lecture. 44 00:02:28,620 --> 00:02:35,670 Considérant que fopen avec passage dans un w sera bar.bmp ouvert, pour l'écriture du fichier et 45 00:02:35,670 --> 00:02:37,020 fait éditer. 46 00:02:37,020 --> 00:02:41,970 >> Alors, maintenant que nous avons ouvert le fichier, notre prochaine étape est de mettre à jour les informations d'en-tête 47 00:02:41,970 --> 00:02:43,230 pour le fichier de sortie. 48 00:02:43,230 --> 00:02:44,610 Qu'est-ce qu'un info-tête? 49 00:02:44,610 --> 00:02:48,160 Eh bien, nous devons d'abord savoir ce bitmap est. 50 00:02:48,160 --> 00:02:51,000 Une image bitmap est une simple arrangement d'octets. 51 00:02:51,000 --> 00:02:55,480 Et ils sont déclarés dans ce fichier ici, bmp.h, avec un groupe de 52 00:02:55,480 --> 00:02:58,610 informations de ce qu'est un bitmap est en fait constituée de. 53 00:02:58,610 --> 00:03:05,730 Mais ce que nous nous soucions vraiment est la en-tête de fichier bitmap, ici, et 54 00:03:05,730 --> 00:03:08,460 les informations en-tête bitmap, ici. 55 00:03:08,460 --> 00:03:13,170 L'en-tête est composé d'un couple de variables qui se révélera très utile. 56 00:03:13,170 --> 00:03:18,400 Il est biSizeImage, qui est le la taille totale de l'image en octets. 57 00:03:18,400 --> 00:03:20,890 Et cela inclut pixels et le rembourrage. 58 00:03:20,890 --> 00:03:24,210 Rembourrage est très important, mais nous y reviendrons plus tard. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth représente la largeur de l' l'image en pixels moins le rembourrage. 60 00:03:30,000 --> 00:03:34,220 BiHeight est alors aussi la hauteur de l'image en pixels. 61 00:03:34,220 --> 00:03:38,240 Et puis la BITMAPFILEHEADER et la BITMAPINFOHEADER, comme je l'ai 62 00:03:38,240 --> 00:03:40,900 plus tôt, ceux-ci sont représentés comme structures. 63 00:03:40,900 --> 00:03:45,410 Donc, vous ne pouvez pas accéder à l'en-tête de fichier lui-même, mais vous aurez envie d'obtenir de 64 00:03:45,410 --> 00:03:47,370 ces variables à l'intérieur. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Alors, comment pouvons nous mettre à jour les informations d'en-tête? 67 00:03:50,600 --> 00:03:54,020 Eh bien, nous devons d'abord voir si nous besoin de modifier les informations de 68 00:03:54,020 --> 00:03:58,480 infile, la clé, à la outfile, le verdict. 69 00:03:58,480 --> 00:04:00,250 Est en train de changer quoi que ce soit dans ce cas? 70 00:04:00,250 --> 00:04:04,320 Eh bien, pas vraiment, parce que nous allons être juste changer les couleurs. 71 00:04:04,320 --> 00:04:07,550 Nous n'allons pas à modifier le fichier la taille, la taille de l'image, de la largeur, 72 00:04:07,550 --> 00:04:08,310 ou la hauteur. 73 00:04:08,310 --> 00:04:14,010 Donc, vous êtes d'accord pour l'instant par copiant simplement chaque pixel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Alors maintenant, nous allons voir comment nous fait peut lire chaque pixel du fichier. 76 00:04:20,720 --> 00:04:23,640 Un autre fichier de fonctions I / O entreront en jeu - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Il faut dans un pointeur vers la struct qui contiendra les octets 79 00:04:28,440 --> 00:04:30,110 vous lisez. 80 00:04:30,110 --> 00:04:31,890 Alors que vous lisez en ce. 81 00:04:31,890 --> 00:04:36,090 Et puis vous passez à une taille, qui est la taille de chaque élément que vous 82 00:04:36,090 --> 00:04:37,360 envie de lire. 83 00:04:37,360 --> 00:04:40,640 Ici, la fonction sizeof vous sera utile. 84 00:04:40,640 --> 00:04:45,570 Ensuite, vous passez en nombre, qui représente le nombre d'éléments d' 85 00:04:45,570 --> 00:04:47,480 taille à lire. 86 00:04:47,480 --> 00:04:51,180 Et puis finalement, inptr, qui est le pointeur de fichier que vous êtes 87 00:04:51,180 --> 00:04:52,530 va lire. 88 00:04:52,530 --> 00:04:58,650 Donc, tous ces éléments sont à l'intérieur inptr et ils vont les données. 89 00:04:58,650 --> 00:05:01,660 >> Regardons un petit exemple. 90 00:05:01,660 --> 00:05:07,590 Si je veux lire en données deux chiens, bien, je peux le faire de deux façons. 91 00:05:07,590 --> 00:05:15,250 Je peux soit lu en deux objets de taille chien de mon inptr, ou je peux lire 92 00:05:15,250 --> 00:05:19,280 dans un objet de la taille de deux chiens. 93 00:05:19,280 --> 00:05:23,580 Donc, vous voyez que selon la manière que vous organisez taille et nombre, vous 94 00:05:23,580 --> 00:05:25,840 peut lire dans le même nombre d'octets. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Alors maintenant, nous allons changer le couleur du pixel comme nous avons besoin. 97 00:05:33,020 --> 00:05:37,320 Si vous regardez bmp.h nouveau, puis vous verrez que au fond 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs sont une autre structure, où ils sont composés de trois octets. 99 00:05:42,920 --> 00:05:49,220 Un, rgbtBlue, rgbtGreen, et rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Donc, chacun de ces représente le montant de bleu, la quantité de vert, et le 101 00:05:52,480 --> 00:05:57,250 quantité de rouge à l'intérieur de ce pixel, où chaque montant est représenté par un 102 00:05:57,250 --> 00:05:58,670 nombre hexadécimal. 103 00:05:58,670 --> 00:06:04,370 >> Donc ff0000 seront de couleur bleue, car il va du bleu, 104 00:06:04,370 --> 00:06:05,850 au vert, au rouge. 105 00:06:05,850 --> 00:06:09,300 Et puis tout f de sera blanc. 106 00:06:09,300 --> 00:06:13,440 Jetons un coup d'oeil à smiley.bmp, qui vous avez dans votre code de distribution. 107 00:06:13,440 --> 00:06:15,690 Si vous l'ouvrez dans juste une image spectateur, alors vous aurez 108 00:06:15,690 --> 00:06:17,080 juste voir un smiley rouge. 109 00:06:17,080 --> 00:06:20,380 Mais en prenant une plongée profonde dans, nous allons voir que la structure 110 00:06:20,380 --> 00:06:22,340 il est juste de pixels. 111 00:06:22,340 --> 00:06:25,880 Nous avons pixels blancs, puis pixels rouges. 112 00:06:25,880 --> 00:06:31,000 Le blanc, ffffff, et puis tout d'un pixels rouges que j'ai coloré en pour vous 113 00:06:31,000 --> 00:06:35,440 ici, et vous voyez qu'ils sont 0000ff. 114 00:06:35,440 --> 00:06:39,760 Zéro bleu, vert zéro, et plein rouge. 115 00:06:39,760 --> 00:06:45,350 Et puisque smiley est de huit pixels de large, nous n'avons pas de rembourrage. 116 00:06:45,350 --> 00:06:47,360 Très bien. 117 00:06:47,360 --> 00:06:53,310 >> Donc, si je devais attribuer des valeurs différentes à un RGBTRIPLE et je voulais 118 00:06:53,310 --> 00:06:58,350 faire le vert, alors ce que je voudrais faire est Je voudrais déclarer un RGBTRIPLE, nommé 119 00:06:58,350 --> 00:07:02,660 triple, puis pour accéder à tous les octet à l'intérieur que je struct 120 00:07:02,660 --> 00:07:04,030 utiliserait l'opérateur point. 121 00:07:04,030 --> 00:07:08,430 Donc triple.rgbtBlue, je peux assignons à 0. 122 00:07:08,430 --> 00:07:13,460 Vert je peux assigner à plein - tout nombre, vraiment, entre 0 et ff. 123 00:07:13,460 --> 00:07:15,470 Et puis rouge, je vais aussi dire 0. 124 00:07:15,470 --> 00:07:19,160 Alors que me donne un pixel vert. 125 00:07:19,160 --> 00:07:23,030 >> Ensuite, si je veux vérifier la valeur de quelque chose? 126 00:07:23,030 --> 00:07:27,250 Je pourrais avoir quelque chose qui vérifie si la valeur de la triple rgbtBlue est 127 00:07:27,250 --> 00:07:31,080 ff et puis imprimez, «Je me sens bleu! ", à la suite. 128 00:07:31,080 --> 00:07:35,640 Maintenant, cela ne signifie pas nécessairement que le pixel est bleu, pas vrai? 129 00:07:35,640 --> 00:07:40,060 Parce que les valeurs vertes et rouges du pixel pourrait également avoir des non-valeurs 0. 130 00:07:40,060 --> 00:07:43,470 Tout cela signifie que, et tout ce qui ce vérifie pour est 131 00:07:43,470 --> 00:07:45,610 pour une couleur bleu plein. 132 00:07:45,610 --> 00:07:50,050 Mais tous les pixels pourraient également avoir partielle valeurs de couleurs, comme ce 133 00:07:50,050 --> 00:07:52,180 prochaine exemple ici. 134 00:07:52,180 --> 00:07:55,400 >> C'est un peu plus difficile à voir Qu'est-ce que l'image est maintenant. 135 00:07:55,400 --> 00:08:00,320 Cela ressemble un peu plus à l' clue.bmp que vous recevrez. 136 00:08:00,320 --> 00:08:03,600 Maintenant, physiquement, vous pouvez résoudre ce problème, parce qu'il ya beaucoup de rouge, par 137 00:08:03,600 --> 00:08:07,040 la tenue d'un écran rouge à l'image de sorte que les autres couleurs peuvent apparaître. 138 00:08:07,040 --> 00:08:10,968 Alors, comment pouvons-nous imitons ce avec c? 139 00:08:10,968 --> 00:08:15,640 Eh bien, nous pourrions supprimer tout rouge complètement de l'image. 140 00:08:15,640 --> 00:08:21,870 Et pour cela, nous avions mis tous les valeur de pixel rouge à 0. 141 00:08:21,870 --> 00:08:25,020 Et si l'image aurait l'air un peu peu comme cela, où nous n'avons pas rouge 142 00:08:25,020 --> 00:08:26,300 que ce soit. 143 00:08:26,300 --> 00:08:29,390 >> Nous pouvons voir le message caché un peu plus clair maintenant. 144 00:08:29,390 --> 00:08:31,730 C'est un autre visage souriant. 145 00:08:31,730 --> 00:08:33,870 Ou peut-être que nous pourrions utiliser une autre méthode. 146 00:08:33,870 --> 00:08:36,480 Peut-être, nous avons pu identifier tous les pixels rouges - 147 00:08:36,480 --> 00:08:41,100 c'est-à-tous les pixels avec 0 bleu, vert 0, et 0 rouge - 148 00:08:41,100 --> 00:08:43,169 et changer celles blanc. 149 00:08:43,169 --> 00:08:45,470 Et notre image peut sembler quelque chose comme ça. 150 00:08:45,470 --> 00:08:48,250 Un peu plus facile à voir. 151 00:08:48,250 --> 00:08:51,170 >> Il ya beaucoup d'autres manières de découvrir le message secret ainsi, 152 00:08:51,170 --> 00:08:53,730 traiter avec la manipulation de la couleur. 153 00:08:53,730 --> 00:08:57,050 Peut-être que vous pouvez utiliser l'une des méthodes que je l'ai mentionné ci-dessus. 154 00:08:57,050 --> 00:08:59,600 Et en plus, vous voudrez peut-être pour améliorer certaines couleurs 155 00:08:59,600 --> 00:09:02,620 et de traduire les sortir. 156 00:09:02,620 --> 00:09:06,190 >> Alors, maintenant que nous avons changé le pixel couleur, à côté nous avons juste besoin de les écrire 157 00:09:06,190 --> 00:09:08,500 pour la ligne de balayage, pixel par pixel. 158 00:09:08,500 --> 00:09:11,860 Et encore une fois, vous aurez envie de regarder en arrière à copy.c, si vous n'avez pas copié 159 00:09:11,860 --> 00:09:18,170 déjà, et de regarder la fwrite fonction, qui prend des données, un pointeur 160 00:09:18,170 --> 00:09:23,230 à la structure qui contient les octets que vous lisez à partir de la taille de 161 00:09:23,230 --> 00:09:26,610 les éléments, le nombre d'éléments, puis la outptr - 162 00:09:26,610 --> 00:09:29,450 la destination de ces fichiers. 163 00:09:29,450 --> 00:09:34,010 >> Après avoir écrit dans les pixels, vous aurez ont aussi écrire dans le rembourrage. 164 00:09:34,010 --> 00:09:34,970 Qu'est-ce que le rembourrage? 165 00:09:34,970 --> 00:09:38,670 Eh bien, chaque pixel de rgbt est de trois octets. 166 00:09:38,670 --> 00:09:43,670 Mais, la ligne de balayage pour une image bitmap doit être un multiple de quatre octets. 167 00:09:43,670 --> 00:09:47,650 Et si le nombre de pixels n'est pas un multiple de quatre, alors nous avons besoin d'ajouter 168 00:09:47,650 --> 00:09:48,880 ce remplissage. 169 00:09:48,880 --> 00:09:51,420 Le remplissage est juste représenté par des 0. 170 00:09:51,420 --> 00:09:54,380 Alors, comment allons-nous écrire, ou lire ce? 171 00:09:54,380 --> 00:09:59,280 Eh bien, il s'avère que vous ne pouvez pas rembourrage fait fread, mais vous pouvez 172 00:09:59,280 --> 00:10:00,970 calculer. 173 00:10:00,970 --> 00:10:04,400 >> Dans ce cas, l'idée et le verdict ont la même largeur, de sorte que le 174 00:10:04,400 --> 00:10:05,910 remplissage est le même. 175 00:10:05,910 --> 00:10:09,370 Et le rembourrage, comme vous le verrez dans copy.c, est calculée 176 00:10:09,370 --> 00:10:11,790 avec la formule ci-dessous - 177 00:10:11,790 --> 00:10:16,690 fois bi.biWidth sizeof (RGBTRIPLE) sera nous donner le nombre d'octets du bmp 178 00:10:16,690 --> 00:10:18,280 a dans chaque ligne. 179 00:10:18,280 --> 00:10:21,890 De là, le modulo et soustractions avec 4 peut calculer 180 00:10:21,890 --> 00:10:25,610 nombre d'octets doivent être ajoutés afin que le multiple d'octets sur 181 00:10:25,610 --> 00:10:27,250 chaque ligne est de quatre. 182 00:10:27,250 --> 00:10:30,490 >> Maintenant que nous avons la formule pour combien nous avons besoin de rembourrage, maintenant 183 00:10:30,490 --> 00:10:31,610 nous pouvons l'écrire. 184 00:10:31,610 --> 00:10:34,080 Maintenant, je l'ai dit avant, rembourrage est à 0. 185 00:10:34,080 --> 00:10:39,730 Donc, dans ce cas, nous sommes en train de mettre un char, dans ce cas un 0, dans notre 186 00:10:39,730 --> 00:10:41,710 outptr - notre fichier de sortie. 187 00:10:41,710 --> 00:10:47,530 Alors, ça peut juste être fputc 0, virgule outptr. 188 00:10:47,530 --> 00:10:52,400 >> Ainsi, alors que nous avons lu dans notre fichier, dossier I / O a gardé la trace de notre 189 00:10:52,400 --> 00:10:57,440 position dans ces fichiers avec quelque chose appelé l'indicateur de position de fichier. 190 00:10:57,440 --> 00:10:59,350 Pensez-y comme un curseur. 191 00:10:59,350 --> 00:11:03,550 Fondamentalement, elle avance à chaque fois que que nous FREAD, mais nous avons 192 00:11:03,550 --> 00:11:05,671 contrôle sur elle, aussi. 193 00:11:05,671 --> 00:11:11,030 >> Pour déplacer l'indicateur de position du fichier, vous pouvez utiliser la fonction fseek. 194 00:11:11,030 --> 00:11:15,600 Lorsque le inptr représente le fichier pointeur que vous êtes à la recherche dans le 195 00:11:15,600 --> 00:11:20,370 montant est le nombre d'octets que vous vouloir déplacer le curseur, puis de 196 00:11:20,370 --> 00:11:23,470 se rapporte à un point de référence d'où votre curseur se trouve. 197 00:11:23,470 --> 00:11:26,770 Si vous passez dans SEEK_CUR, que représente le courant 198 00:11:26,770 --> 00:11:28,100 position dans le fichier. 199 00:11:28,100 --> 00:11:31,020 Ou vous pouvez utiliser d'autres paramètres. 200 00:11:31,020 --> 00:11:35,400 Donc, nous pourrions utiliser fseek sauter sur le rembourrage du dossier dans. 201 00:11:35,400 --> 00:11:39,410 Et encore une fois, si vous êtes coincé, il ya un exemple de ce que dans copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Alors maintenant, nous avons ouvert le fichier, l'indice, et le verdict. 203 00:11:43,260 --> 00:11:46,450 Nous avons mis à jour les informations d'en-tête pour notre verdict, parce que chaque 204 00:11:46,450 --> 00:11:48,730 bitmap a besoin d'une tête. 205 00:11:48,730 --> 00:11:52,280 Nous avons alors lisons dans la clé de ligne de balayage, pixel par pixel, en changeant 206 00:11:52,280 --> 00:11:55,210 toutes les couleurs en tant que de besoin, et écrit ceux dans le 207 00:11:55,210 --> 00:11:57,340 verdict, pixel par pixel. 208 00:11:57,340 --> 00:12:01,550 Une fois que vous ouvrez verdict, vous pouvez voir qui le coupable, ou quel est le secret 209 00:12:01,550 --> 00:12:02,850 message est. 210 00:12:02,850 --> 00:12:05,550 Mon nom est Zamyla, et c'était polar. 211 00:12:05,550 --> 00:12:12,864