1 00:00:00,000 --> 00:00:10,210 >> [MUSIQUE JEU] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: le coup de Let les choses avec redimensionnement. 3 00:00:13,320 --> 00:00:17,710 En redimensionnement, l'utilisateur passera dans, par la ligne de commande, une image bitmap 4 00:00:17,710 --> 00:00:21,860 ils veulent mettre à l'échelle par un nombre qu'ils passent également dans, 5 00:00:21,860 --> 00:00:23,770 dans la ligne de commande. 6 00:00:23,770 --> 00:00:24,690 Comment faisons-nous cela? 7 00:00:24,690 --> 00:00:28,270 >> Eh bien, Tout d'abord, laissez nous décomposer en étapes. 8 00:00:28,270 --> 00:00:31,510 Vous allez avoir à ouvrir le fichier-entrée qu'ils vous donnent, ainsi que 9 00:00:31,510 --> 00:00:35,560 créer et ouvrir le fichier de sortie que vous allez mettre la 10 00:00:35,560 --> 00:00:38,020 image redimensionnée po 11 00:00:38,020 --> 00:00:42,050 Ensuite, parce que vous êtes le redimensionnement, et parce que c'est une image bitmap, un en-tête, de sorte 12 00:00:42,050 --> 00:00:46,080 vous allez également mettre à jour l'en-tête informations pour le fichier de sortie, 13 00:00:46,080 --> 00:00:47,950 et écrire que po 14 00:00:47,950 --> 00:00:51,850 Ensuite, vous allez lire dans la ligne de balayage maximale du fichier, 15 00:00:51,850 --> 00:00:56,890 pixel par pixel, le redimensionnement de l'horizontale et l'écriture de ces pixels dans la 16 00:00:56,890 --> 00:01:00,910 outfile, comme spécifié par l'échelle de l'utilisateur. 17 00:01:00,910 --> 00:01:03,940 >> Vous allez vous rappeler de ajouter rembourrage nécessaire. 18 00:01:03,940 --> 00:01:05,400 Plus sur cela plus tard. 19 00:01:05,400 --> 00:01:07,790 Et puis, redimensionner aussi verticalement. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Donc cela va être un peu plus Qui compliqué que faire, mais 22 00:01:13,280 --> 00:01:18,310 ce qui est similaire, c'est que copy.c volonté, de plus, s'avérer très utile. 23 00:01:18,310 --> 00:01:23,160 Rappelez-vous que copy.c ouvre un fichier, met à jour les informations d'en-tête pour l' 24 00:01:23,160 --> 00:01:28,250 outfile, puis lit dans la ligne de balayage, pixel par pixel, chaque pixel d'écriture 25 00:01:28,250 --> 00:01:30,510 dans la ligne de balayage de fichier de sortie. 26 00:01:30,510 --> 00:01:37,040 >> Encore une fois, votre première étape pourrait probablement être à cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 dans votre répertoire PSET5. 28 00:01:40,560 --> 00:01:43,920 Rappelez-vous cependant, avant de le copier, pour s'assurer que vous comprenez 29 00:01:43,920 --> 00:01:46,600 copy.c très bien. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Donc, nous allons ouvrir un fichier. 32 00:01:49,880 --> 00:01:50,870 Vous savez comment le faire. 33 00:01:50,870 --> 00:01:52,600 Je vais laisser cela à vous. 34 00:01:52,600 --> 00:01:56,050 Ensuite, mettre à jour les informations d'en-tête pour le fichier de sortie. 35 00:01:56,050 --> 00:01:59,240 Parce que nous avons un nouveau bitmap, nous avons de nouvelles informations d'en-tête. 36 00:01:59,240 --> 00:02:00,970 Qu'est-ce que ça change ici? 37 00:02:00,970 --> 00:02:06,000 Eh bien, la taille du fichier va changer parce que nous allons avoir plus 38 00:02:06,000 --> 00:02:07,900 pixels qu'auparavant. 39 00:02:07,900 --> 00:02:11,060 La taille de l'image est, par conséquent, également va changer, ce qui est le 40 00:02:11,060 --> 00:02:13,050 la largeur et la hauteur. 41 00:02:13,050 --> 00:02:17,180 >> Donc, les variables qui sont ceux, exactement? 42 00:02:17,180 --> 00:02:20,960 Eh bien, si vous regardez dans l'en-tête informations, voyez-vous, il est 43 00:02:20,960 --> 00:02:25,640 biSizeImage, qui représente le total la taille de l'image en octets, 44 00:02:25,640 --> 00:02:28,340 comprenant des pixels et le rembourrage. 45 00:02:28,340 --> 00:02:32,520 biWidth est la largeur de l'image en pixels, moins le rembourrage. 46 00:02:32,520 --> 00:02:35,580 biHeight est la hauteur de l'image en pixels. 47 00:02:35,580 --> 00:02:39,200 Et si ceux qui sont contenus dans la struct BITMAPFILEHEADER et 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Vous pouvez dire que l'on est qui, par aller à bmp.h et en regardant la 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER structure et de voir les variables qui y sont répertoriés. 51 00:02:49,670 --> 00:02:54,700 >> Donc, pour mettre à jour l'en-tête outfiles informations, vous allez vouloir 52 00:02:54,700 --> 00:02:57,025 changer les valeurs de la la hauteur et la largeur. 53 00:02:57,025 --> 00:03:00,570 Mais les chances sont, vous pourriez avoir besoin d' de l'information d'en-tête de la fichier_d_entree 54 00:03:00,570 --> 00:03:03,670 plus tard, donc il vaut mieux garder la trace des deux. 55 00:03:03,670 --> 00:03:07,770 Mais être très clair avec votre variable noms de sorte que vous n'avez pas accidentellement 56 00:03:07,770 --> 00:03:12,490 écrire les valeurs incorrectes dans l'en-tête pour le fichier de sortie. 57 00:03:12,490 --> 00:03:16,160 >> Alors maintenant, passons à la lecture dans la ligne de balayage pixel par pixel. 58 00:03:16,160 --> 00:03:20,210 Encore une fois, nous allons parler de notre fidèle Bibliothèque de fichiers I / O, et regarder 59 00:03:20,210 --> 00:03:22,100 la fonction fread. 60 00:03:22,100 --> 00:03:26,150 fread prend un pointeur vers une structure qui contiendra les octets 61 00:03:26,150 --> 00:03:30,130 vous lisez dans, la taille de chaque élément que vous lisez - 62 00:03:30,130 --> 00:03:34,410 de plus, sizeof va être utile fonctionner ici, le numéro de l' 63 00:03:34,410 --> 00:03:38,820 éléments de taille, la taille, que vous êtes lecture, et enfin, la 64 00:03:38,820 --> 00:03:41,310 inpointer, le fichier que vous lisez. 65 00:03:41,310 --> 00:03:46,770 Donc vous prenez des éléments numériques de la taille de inpointer, et 66 00:03:46,770 --> 00:03:49,040 leur mise en données. 67 00:03:49,040 --> 00:03:51,695 >> Maintenant il est temps de redimensionner horizontalement. 68 00:03:51,695 --> 00:03:56,880 si n est égal à 2, puis, pour chaque pixel dans infile, nous allons écrire 69 00:03:56,880 --> 00:04:00,870 deux fois dans le fichier de sortie. 70 00:04:00,870 --> 00:04:02,210 Comment écrire des fichiers? 71 00:04:02,210 --> 00:04:06,400 Eh bien, nous avons la fonction fwrite, si nous avons pris le pointeur sur la structure 72 00:04:06,400 --> 00:04:10,170 qui contient les octets que vous êtes écrit par, puis nous passons en 73 00:04:10,170 --> 00:04:14,430 la taille, le nombre et la sortie, où vous allez être écrit. 74 00:04:14,430 --> 00:04:19,200 Et puis de répéter un processus, seront mesure simple itératif pour la boucle. 75 00:04:19,200 --> 00:04:21,740 >> Mais nous devons nous rappeler d'ajouter le remplissage po 76 00:04:21,740 --> 00:04:26,040 Le concept de remplissage est que, eh bien, chaque pixel est de trois piqûres, mais la 77 00:04:26,040 --> 00:04:28,940 taille de chaque ligne de balayage de moût de être un multiple de 4 octets. 78 00:04:28,940 --> 00:04:33,660 Donc, si le nombre de pixels n'est pas un multiple de 4, nous avons besoin d'ajouter un peu 79 00:04:33,660 --> 00:04:36,630 rembourrage, qui est seulement des zéros. 80 00:04:36,630 --> 00:04:42,130 Maintenant, à la différence qui fait, et contrairement à copie, puis l'image infile et la 81 00:04:42,130 --> 00:04:44,370 fichier outfile ont différentes ont rembourrage différent parce qu'ils sont 82 00:04:44,370 --> 00:04:46,360 des largeurs différentes. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Alors peut-être une formule serait être utile ici. 85 00:04:51,050 --> 00:04:55,120 Je vous laisse le soin de le découvrir, mais vous dire que, pour écrire rembourrage, 86 00:04:55,120 --> 00:04:59,360 bien, c'est juste une fonction de fputc simple, passant dans le caractère 87 00:04:59,360 --> 00:05:02,200 que vous voulez écrire, puis le pointeur de fichier que vous 88 00:05:02,200 --> 00:05:04,280 vouloir écrire. 89 00:05:04,280 --> 00:05:08,670 Alors, maintenant que nous avons redimensionné horizontalement, et ensuite utilisé rembourrage, 90 00:05:08,670 --> 00:05:12,030 n'oubliez pas que vous devez déplacer votre fichier indicateur de position, parce que vous 91 00:05:12,030 --> 00:05:14,480 ne peut pas FREAD en rembourrage. 92 00:05:14,480 --> 00:05:18,230 Donc, vous voulez vous assurer que votre fichier l'indicateur de position dans le fichier_d_entree 93 00:05:18,230 --> 00:05:19,980 est au bon endroit. 94 00:05:19,980 --> 00:05:23,970 Parce que nous voulons aussi redimensionner verticalement. 95 00:05:23,970 --> 00:05:27,090 Nous ne pouvons pas étirer horizontalement, parce que tous les besoins de lignes 96 00:05:27,090 --> 00:05:30,370 à copier n fois. 97 00:05:30,370 --> 00:05:33,050 >> Maintenant, il ya plusieurs différents façons de le faire. 98 00:05:33,050 --> 00:05:39,010 Donc un, nous pouvons utiliser une méthode de réécriture, en que nous nous souvenons de tous les pixels 99 00:05:39,010 --> 00:05:42,840 d'une ligne donnée dans un tableau, et alors nous écrivons ce tableau comme 100 00:05:42,840 --> 00:05:44,730 autant de fois que nécessaire. 101 00:05:44,730 --> 00:05:49,530 Ou il ya la méthode de recopie où, après avoir lu dans une ligne dans le fichier-entrée 102 00:05:49,530 --> 00:05:53,530 puis écrit dans le fichier de sortie, ajoutant le rembourrage, nous FSEEK 103 00:05:53,530 --> 00:05:57,250 revenir au début de la ligne d'origine, et puis répétez l'horizontale 104 00:05:57,250 --> 00:05:58,710 redimensionnement à partir de là. 105 00:05:58,710 --> 00:06:02,280 Peu importe la méthode, cependant, vous aurez voulons que chaque pixel à répéter 106 00:06:02,280 --> 00:06:06,370 n fois, et chaque ligne pour être répétée n fois ainsi. 107 00:06:06,370 --> 00:06:09,160 >> Avec cela, vous aurez bitmap plus grand que la vie. 108 00:06:09,160 --> 00:06:11,760 Mon nom est Zamyla, et c'est CS50. 109 00:06:11,760 --> 00:06:19,542