金陵的贫穷书生顾生靠卖画扇为生,与病弱老母相依为命。顾生偶入隔壁一座早已废弃的荒宅,并在两只神奇蝴蝶的启发下,画成了一幅绝美的双蝶图。一日,一位白衣少年前来,点名要买顾生那幅双蝶图画扇。正在此时,一黑衣人被一队卫兵追杀到他们跟前,反应不及的顾生成了卫兵的挡箭牌,黑衣人冰凉的剑锋一下子抵在顾生的咽喉之上。所幸黑衣人手下留情,落荒而逃的顾生才拣了条性命。是夜,顾生应邀来到白衣少年暂居的客栈,取回了遗失的行囊和画扇。心存感激的顾生将双蝶画扇馈赠白衣少年,自称白云的白衣少年将画扇题为《梦蝶图》。两人谈得投机,引为知己。顾生还向白云说起在荒宅作画、邂逅跳舞的红衣女子的经历,白云却认为那不过是单身汉顾生的白日梦而已。深夜街头,醉酒的顾生受到卫兵的盘问,方知有金陵凶徒大开杀戒。次日,果真有一位叫红玉的红衣少女住进了隔壁的荒宅,她还来向顾母告贷借米,声称要赡养垂危的老母。顾生对艳若桃李却冷若冰霜红玉一见钟情,白云自告奋勇前往荒宅为顾生提亲,还赠送佩玉作为顾生的聘礼,但红玉婉言拒绝了这门婚事。心情郁闷的顾生在白云的客房内喝得酩酊大醉,只得留宿在白云床上。睡眼朦胧之中,白云变成了一位迷人的姑娘,主动与顾生亲近温存。顾母责怪顾生夜不归宿,对顾生新近结交的白云也心存狐疑。顾生一如既往周济红玉母女,红玉也时常像晚辈亲人一样伺候顾母。但对于顾生的示爱,红玉依然只有冷淡与漠然。力劝顾生放弃追求红玉不果,失落的白云心生醋意。久病的红玉母亲过世,顾生全力帮助料理后事。由于金陵凶徒的作乱,顾生母子劝孤身一人的红玉搬进顾家暂住,红玉未置可否。白云约顾生到百花楼见面,而顾生在那里见到的居然是一身烟花女子打扮的红玉。红玉拒绝说明原委,深感失望的顾生对白云也心存芥蒂。得知当夜百花楼有烟花女子为金陵凶徒所杀,关切的顾生赶到荒宅,却不见红玉的踪影。顾生在荒宅门前的守望中睡去,让天亮回来的红玉备受感动。红玉主动向顾生献身,但激情之后又要求顾生下不为例。红玉用出人意料的刀法切除了顾母身上的毒筋,又让顾生警告白云别再跟踪骚扰自己,否则决不留情。红玉又一次主动与顾生幽会,却被白云堵在交欢的卧榻之上。愤怒至极的红玉与白云展开生死搏杀,善良的顾生请求红玉放过受伤的白云,而白云却现形为白狐逃生而去。顾生对昼伏夜出、行踪诡秘的红玉担心不已,而红玉却声称自己已经孕有顾家的血脉,这让顾生母子既兴奋又诧异。红玉艰难地生下儿子天赐不久,终于杀掉了金陵巡按吴大人,并向顾生和盘端出自家惨遭陷害、满门抄斩的往事,如今血仇已偿大恩已报,身为女鬼的红玉必须回到冥界万劫不复的黑暗之中。红玉带着对骨肉亲人的万般留恋,在清晨的朝阳中慢慢消失……不久之后,一个漂亮的白衣女子出现在金陵街头,恢复女儿身的白云回到顾生身边,代替红玉姐姐照料顾生父子,《梦蝶图》中飞舞的双双蝴蝶又幻化成为翩翩起舞的红玉……