|
DOS环境下插入图片,入图这事儿搁今天听着像考古。片文但真在纯命令行界面里操作过的编辑人,都懂那种在黑白字符间硬塞一张图的入图荒诞感——屏幕上突然冒出一块像素点阵,像黑白电视里闯进一帧彩色画面。片文 当年我用的编辑是Turbo C写的图形程序,配合BGI驱动。入图想往文本界面里插图片?片文得先摸清VGA模式的门道。DOS默认的编辑80×25文本模式压根不支持图片,你得先调用中断10H,入图把显卡切到图形模式,片文比如经典的编辑12H模式(640×480,16色)。入图切换那瞬间,片文屏幕会“啪”地闪一下,编辑字符全没了,变成一片灰蒙蒙的颗粒。 真正麻烦的是图片数据从哪来。BMP文件?得先解析文件头,跳过54字节的BITMAPFILEHEADER和BITMAPINFOHEADER,找到像素数组的偏移量。然后还得注意——BMP是自底向上存储的,读取时得倒着来,否则图片上下颠倒,像是故意跟你作对。我当时调试了半天,最后发现是忘了反转Y轴,气得差点把键盘拍碎。 图像数据读进来后,还得处理调色板。16色模式还好,每个像素只占4位,但得先把颜色值映射到VGA的64色调色板上。那会儿没有现成的库函数,全靠自己写setpalette()调用。调色板搞错,整个图片会变成诡异的霓虹色——人脸是绿的,天空是紫的,像嗑了药。 插入位置也是个问题。不像Windows里拖个鼠标就行,DOS下你得算好屏幕坐标和图片尺寸的对应关系。假设图片是100×100像素,放在(320,240)中心点,那左上角就得是(270,190)。还得判断图片会不会超出屏幕边界——超了就直接截断,没有任何滚动条或缩放选项。我见过有人硬塞一张800×600的图进去,结果只显示左上角一小块,剩下的全在屏幕外头,跟盲人摸象似的。 最坑的是内存。DOS实模式只有640KB可用,一张320×200的256色BMP,光像素数据就占64KB,再加上程序本身和缓冲区,内存紧张得跟春运火车似的。我当时用了个笨办法:分块读取,每次只处理一行像素,画完一行再读下一行。速度慢是慢点,但至少不会因为内存不足直接黑屏死机。 现在回头看,这些折腾显得特别笨拙。但那种在字符终端里硬生生抠出一块图形区域的感觉,像在沙漠里挖出一口井。每次图片成功显示出来,哪怕只是张粗糙的测试图,屏幕上那堆像素都像在发光——虽然实际上只是16种颜色里的某几种,但在那个全是文字的界面里,它们就是最鲜活的东西。 |