为何StretchBlt()将图片缩小 颜色会不对

来源:互联网 发布:出租屋宽带网络拓扑图 编辑:程序博客网 时间:2024/06/02 23:07

為何StretchBlt()將圖片縮小 顏色會不對 


在window中要貼圖常用到StretchBlt() function
然而這function 有個問題 就是圖片縮小時 顏色會錯誤
這個問題很好解 只需要呼叫SetStretchBltMode() 即可
      CPaintDC dc;
      CDC sdc;
      // 圖片的載入放中間

      dc.SetStretchBltMode(STRETCH_DELETESCANS);
      dc.StretchBlt(0,0,100,100,&sdc,0,0,100,100,SRCCOPY);

先解釋一下StretchBlt() 的作用模式
當StrecthBlt() 的目標比來源小時 必須要將一些點去掉
他的預設做法 是將要去掉的點與旁邊的點做AND運算
這也就是為什麼 顏色會錯誤的原因
至於為什麼預設做法是要用AND運算呢
這是因為 如果這張圖是黑底白字的話 如果要砍點 則會有可能把字的線條給砍掉
這樣縮小之後的圖 上面的文字便會壞掉
如果是使用AND運算的話 便可以保留上面的文字
不過缺點就是圖的顏色會錯掉


我們可以使用SetStretchBltMode() 將處理方法改成STRETCH_DELETESCANS
這樣他便會直接將不要的點給砍掉 就不會有顏色錯誤的問題發生
另外 也可以換成 STRETCH_HALFTONE
half tone 會將要刪掉的像素跟周圍中和起來
這樣可得到較好的畫質 不過速度也會變慢