none
使用StretchBlt將圖片縮小並重覆合併的問題(VB6) RRS feed

  • 問題

  • 外觀有picture1,picture2,和按鈕1
    我的目的是希望按下按鈕後,將picture1上的640x480圖片縮小為320x240,
    貼在一張空白的640x480圖片上,且那320x240的圖片可在那空白的640x480上選擇位置貼上合併,然後顯示在picture2上
    (意思就是會看到picture2上是一張640x480的圖,其中picture1的圖占去上面的320x240的面積,其他部份為白色)

    我目前是已做到按下按鈕後可貼上縮小圖
    但我的問題是 希望能每按下按鈕後都能累加合併圖片在picture2上,而不是清掉picture2後又重新運算
    即picture2上能一直貼上320x240的小圖,可與上一次的貼圖覆蓋到,亦貼在空白處並存出現,
    (就像一直在小畫家上面貼東西,會蓋到部份,但沒蓋到的還是會存在)

    我目前是希望能有重覆貼上的功能

    以下是我之前的寫法

    Private Sub Command1_Click()
       
        Dim X_New_Start As Long
        Dim Y_New_Start As Long
       
        X_New_Start = Xp '運算出新的縮小圖要貼的位置 過程省略
     
        Y_New_Start = Yp '運算出新的縮小圖要貼的位置 過程省略
         
       
        FormLinkImage.Picture2.PaintPicture FormLinkImage.Picture1, 0, 0, 640, 480, _
                                                                    0, 0, 640, 480, _
                                                                    &HFF0062 '將picture2清為白,但我覺得這方式不大適合

        Call SetStretchBltMode(FormLinkImage.Picture2.hDC, HALFTONE)
       
        StretchBlt FormLinkImage.Picture2.hDC, X_New_Start, Y_New_Start, 320, 240, _
                    FormLinkImage.Picture1.hDC, 0, 0, 640, 480, &HCC0020 '縮小圖貼上

       
    End Sub

    請前輩指導一下如何對hDC做累加重覆運算?
    且我的新創造一張空白圖作法有點蠢,請指教有無適合的方法

    在此感謝

    2010年2月24日 上午 03:21

解答

  • 把Picture2.BackColor屬性設為白色,清白這列註解,其它兩列照舊試試...
    • 已標示為解答 Tenmo 2010年2月25日 上午 01:15
    2010年2月24日 上午 07:55

所有回覆

  • 把Picture2.BackColor屬性設為白色,清白這列註解,其它兩列照舊試試...
    • 已標示為解答 Tenmo 2010年2月25日 上午 01:15
    2010年2月24日 上午 07:55
  • 請定義累加重複運算。

    PaintPicture 本身就有縮放功能,不清楚你為何還要呼叫 StretchBlt

    從你的描述,看起來一行 PaintPicture 就搞定了,注意目標位置的說明。以下摘自線上手冊:

    object.PaintPicture picture, x1, y1, width1, height1, x2, y2, width2, height2, opcode

    x2, y2 選擇性引數。單精確度數值,指示 picture 內剪貼區的座標 (x-軸和 y-軸)。object ScaleMode 屬性決定使用的測量單位。如果該引數省略,則假設為 0。
    Width2 選擇性引數。單精確度數值,指示 picture 內剪貼區的源寬度。object ScaleMode 屬性決定使用的測量單位。如果該引數省略,則使用整個來源寬度。
    Height2 選擇性引數。 單精確度數值,指示 picture 內剪貼區的來源高度。object ScaleMode 屬性決定使用的測量單位。如果該引數省略,則使用整個來源高度

    Opcode 選擇性引數。是僅由點陣圖使用的長型數值或程式碼。用來定義在繪製 pictur object 上,對 picture 執行處理位元的運算 (例如,vbMergeCopyvbSrcAnd)。關於處理位元的運算元常數的完整清單,請參閱 Visual Basic 說明中的 RasterOp 常數。



    OPCode
    常數名數值說明
    DSINVERT 5570569 反向目標點陣圖,&H00550009
    MERGECOPY 12583114 合併模式和來源點陣圖,&HC000CA
    MERGEPAINT 12255782 用 Or 運算合併反向播放的來源點陣圖和目標點陣圖,&HBB0226
    NOTSRCCOPY 3342344 複製反向播放的來源點陣圖到目標點陣圖,&H330008
    NOTSRCERASE 1114278 用 Or 運算合併來源點陣圖和目標點陣圖,然後反向播放,&H1100A6
    PATCOPY 15728673 將模式複製到目標點陣圖,&HF00021
    PATINVERT 5898313 用 Xor 運算合併目標點陣圖與模式,&H5A0049
    PATPAINT 16452105 用 Or 運算合併反向播放的來源點陣圖與模式。然後用 Or 運算合併上述結果與目標點陣圖,&HFB0A09
    SRCAND 8913094 用 And 運算合併目標像素與來源點陣圖,&H8800C6
    SRCCOPY 13369376 複製來源點陣圖到目標點陣圖,&HCC0020
    SRCERASE 71303976 反向播放目標點陣圖並用 And 運算合併所得結果與來源點陣圖,&H4400328
    SRCINVERT 6684742 用 Xor 運算合併目標像素和來源點陣圖,&H660046
    SRCPAINT 15597702 用 Or 運算合併目標像素和來源點陣圖,&HEE0086

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年2月24日 下午 12:41
  • 感謝樓上兩位的講解
    結合兩位的方式已可達到我的需求

    單就Joe Hung先生的方法已可使我的原程式達到重覆運算的功能
    小弟由衷感謝 並已當作解答

    且心冷熱情熄先生的方法我之後也有寫出來
    在此也十分感謝~
    2010年2月25日 上午 01:15