金陵的貧窮書生顧生靠賣畫扇為生,與病弱老母相依為命。顧生偶入隔壁壹座早已廢棄的荒宅,並在兩只神奇蝴蝶的啟發下,畫成了壹幅絕美的雙蝶圖。
壹日,壹位白衣少年前來,點名要買顧生那幅雙蝶圖畫扇。正在此時,壹黑衣人被壹隊衛兵追殺到他們跟前,反應不及的顧生成了衛兵的擋箭牌,黑衣人冰涼的劍鋒壹下子抵在顧生的咽喉之上。所幸黑衣人手下留情,落荒而逃的顧生才揀了條性命。
是夜,顧生應邀來到白衣少年暫居的客棧,取回了遺失的行囊和畫扇。心存感激的顧生將雙蝶畫扇饋贈白衣少年,自稱白雲的白衣少年將畫扇題為《夢蝶圖》。兩人談得投機,引為知己。顧生還向白雲說起在荒宅作畫、邂逅跳舞的紅衣女子的經歷,白雲卻認為那不過是單身漢顧生的白日夢而已。深夜街頭,醉酒的顧生受到衛兵的盤問,方知有金陵兇徒大開殺戒。
次日,果真有壹位叫紅玉的紅衣少女住進了隔壁的荒宅,她還來向顧母借米,聲稱要贍養垂危的老母。顧生對艷若桃李卻冷若冰霜紅玉壹見鐘情,白雲自告奮勇前往荒宅為顧生提親,還贈送佩玉作為顧生的聘禮,但紅玉婉言拒絕了這門婚事。
心情郁悶的顧生在白雲的客房內喝得酩酊大醉,只得留宿在白雲床上。睡眼朦朧之中,白雲變成了壹位迷人的姑娘,主動與顧生親近溫存。顧母責怪顧生夜不歸宿,對顧生新近結交的白雲也心存狐疑。
顧生壹如既往周濟紅玉母女,紅玉也時常像晚輩親人壹樣伺候顧母。但對於顧生的示愛,紅玉依然只有冷淡與漠然。力勸顧生放棄追求紅玉不果,失落的白雲心生醋意。
久病的紅玉母親過世,顧生全力幫助料理後事。由於金陵兇徒的作亂,顧生母子勸孤身壹人的紅玉搬進顧家暫住,紅玉未置可否。白雲約顧生到百花樓見面,而顧生在那裏見到的居然是壹身煙花女子打扮的紅玉。紅玉拒絕說明原委,深感失望的顧生對白雲也心存芥蒂。
得知當夜百花樓有煙花女子為金陵兇徒所殺,關切的顧生趕到荒宅,卻不見紅玉的蹤影。顧生在荒宅門前的守望中睡去,讓天亮回來的紅玉備受感動。紅玉主動向顧生獻身,但激情之後又要求顧生下不為例。
紅玉用出人意料的刀法切除了顧母身上的毒筋,又讓顧生警告白雲別再跟蹤騷擾自己,否則決不留情。紅玉又壹次主動與顧生幽會,卻被白雲堵在交歡的臥榻之上。憤怒至極的紅玉與白雲展開生死搏殺,善良的顧生請求紅玉放過受傷的白雲,而白雲卻現形為白狐逃生而去。
顧生對晝伏夜出、行蹤詭秘的紅玉擔心不已,而紅玉卻聲稱自己已經孕有顧家的血脈,這讓顧生母子既興奮又詫異。紅玉艱難地生下兒子天賜不久,終於殺掉了金陵巡按吳大人,並向顧生和盤端出自家慘遭陷害、滿門抄斬的往事,如今血仇已償大恩已報,身為女鬼的紅玉必須回到冥界萬劫不復的黑暗之中。紅玉帶著對骨肉親人的萬般留戀,在清晨的朝陽中慢慢消失。
不久之後,壹個漂亮的白衣女子出現在金陵街頭,恢復女兒身的白雲回到顧生身邊,代替紅玉姐姐照料顧生父子,《夢蝶圖》中飛舞的雙雙蝴蝶又幻化成為翩翩起舞的紅玉。