none
bitmap繪圖的問題 RRS feed

  • 問題

  •  

    請問一下 bitmap繪圖方法的問題

    因為我是要在地圖上畫一個小人的圖

    小人代表目前的位置 因為地圖是會動的

    所以地圖跟小人都是用bitmap畫出來

     

    小人是在地圖上面

    我小人的部份是有去背了 就是有用firework把背景色去掉了

    可是在PDA上畫出來還是有白色

    用小畫家開 背景不是黑色就是白色

     

    我想請問一下  有辦法"不繪出白色的部份呢??"

    就是"濾掉我不要的顏色 在繪圖的時候就不要繪出來"

    只顯示我要的圖案部份

     

    請問有辦法做到嘛

    謝謝各位

    2008年10月21日 下午 03:42

所有回覆

  • 多選一:

    1. 一般做法:小人直接畫,不要用圖檔拉

    2. 多圖層套疊:用 emf 格式不要底色

    3. 自訂控制項:用 System.Drawing.Drawing2D.GraphicsPath 描邊建成 Region ,然後在 OnPaint 事件只畫 Region 部分。

    2008年10月22日 上午 03:31
  • 4. API 考貝: BitBlt (我忘了 DrawImage 有沒有互斥運算... ,我先前用過 API)
    2008年10月22日 上午 03:33
  • 1. 一般做法:小人直接畫,不要用圖檔拉

            Dim myGraphics As Graphics = PictureBox3.CreateGraphics  <=背景
            Dim myGraphics2 As Graphics = PictureBox3.CreateGraphics  <=小人
           

            Dim myBitmap As New Bitmap("C:\1010v2\1010\res\map_color4.gif")    <=背景

            Dim myBitmap2 As New Bitmap("C:\1010v2\1010\res\0102.gif")    <=小人

            

            Dim sgle As New RectangleF(0, 0, 430, 433) 'size
            Dim units As GraphicsUnit = GraphicsUnit.Pixel  'unit

     

            myGraphics.DrawImage(myBitmap, 2, 2, sgle, units)  'map

            myGraphics2.DrawImage(myBitmap2, 215, 160, 50, 64)   'icon

    請問我這樣是直接畫了嘛(應該是吧??)

    還是您說的直接畫還有其它方法,不過我就是不要畫出某個顏色(例如白色的我都不要畫出)

    有辦法嘛 謝謝您了^^

    感激不盡

     

     2. 多圖層套疊:用 emf 格式不要底色

    我再 google看看 我沒聽過

     

    3. 自訂控制項:用 System.Drawing.Drawing2D.GraphicsPath 描邊建成 Region ,然後在 OnPaint 事件只畫 Region 部分。

     

    這個我也要再trytry 不過感覺1應該是最簡單方法吧

    2008年10月22日 上午 07:07
  • Code Snippet

    一般做法:小人直接畫,不要用圖檔拉

     

     

    直接畫指的是直接用繪圖指令畫出來,你明明就用圖檔啊... 0102.gif 就是圖檔。
    2008年10月22日 上午 08:47
  •  

    請問您說的繪圖指令是..?

    drawimage..???

    沒有圖檔要怎繪出來呢

    謝謝您了

    2008年10月22日 上午 08:49
  • 繪圖指令是指 DrawLines / DrawString / DrawRect 等這種,這種沒有外框底色,比較沒問題。

    DrawImage 是你從圖檔拉出來的內容,本身包含底色。

     

    前面有個 4 是我以前用過的,待會我查一下我另一個案子怎樣做的。

    2008年10月22日 上午 09:28
  •  

    謝謝您了 如果有找到方法

    再請您能否貼給小弟看一下

     

    我自己也會快點查看看怎麼做

    謝謝您 感激不盡^^

    2008年10月22日 上午 09:30
  • 我剛剛試過,若你透明色設好,用方法 2 是 OK 。

     

    1. 我的做法是開一個 emf

    2. 用

    Code Snippet
    grfx.DrawImage(Image.FromFile(strFile), destRect)

     

     

    a. 畫底圖

    b. 畫其它圖 (我測試 png / gif 都正常)

    c. 畫其它

     

    3. PictureBox.Image = emf

     

    我想你開一個新的 bmp 應該也是可以,但是應該要 32 bits color ,這樣的 bmp 才能允許透明色。

     

    圖層由下而上

    a. 海色 (直接填色)

    b. 陸地 (emf)

    c. 衛星照片 (gif ,測試用隨便疊,沒校正座標)

    d. 區域邊界 (emf)

     

    補充:我是在 Windows 下測的,建議你在 Windows 下先測完,再轉移到行動裝置上,因為 CF 有很多不支援...

    2008年10月22日 上午 09:48
  •  

    謝謝您 我來trytry看

    真的非常謝謝您的幫忙

    2008年10月22日 下午 01:50
  •  

    再請問一下  emf的部份要引用什麼嘛??

    dim  m  as metafile <=這行都有問題

     

    該引用的我也都引用啦

    Imports System.io
    Imports System
    Imports System.MarshalByRefObject
    Imports System.Drawing
    Imports System.Drawing.Imaging
    Imports System.Windows.Forms
    ' for Marshal.Copy
    Imports System.Runtime.InteropServices

     

     msdn上是寫system.drawing.metafile

     

    為何我寫就是不行嘞

    謝謝大大了

     

    2008年10月23日 下午 12:16
  • 請先看 MetaFile 建構函式

     

    emf 建構比較複雜,所以前面說過:

    Code Snippet

    我想你開一個新的 bmp 應該也是可以,但是應該要 32 bits color ,這樣的 bmp 才能允許透明色。

     

     

    範例:

    Code Snippet

     

    Dim bmp As New Bitmap(PictureBox1.ClientSize.Width, PictureBox1.ClientSize.Height, Imaging.PixelFormat.Format32bppPArgb)

    Dim grfx As Graphics = Graphics.FromImage(bmp)

    grfx.DrawImage(Image.FromFile(Application.StartupPath & "\test.png"), PictureBox1.ClientRectangle)

    grfx.DrawImage(Image.FromFile(Application.StartupPath & "\Earth.png"), PictureBox1.ClientRectangle)

    grfx.Dispose()

    PictureBox1.Image = bmp

     

     

    若想建立向量檔 emf ,可參考先前相關討論:

    http://forums.microsoft.com/MSDN-CHT/Search/Search.aspx?words=MetaFile&localechoice=31748&SiteID=14&searchscope=allforums

    2008年10月23日 下午 02:32
  •  

    謝謝謝謝

    真的很感謝您 

    我馬上就試試看^^ 如果解決了我也會快點來po文

     

    2008年10月23日 下午 02:34
  •  grfx.DrawImage(Image.FromFile(Application.StartupPath & "\map_cilor2.gif"), PictureBox1.ClientRectangle)

                            ^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    顯示錯誤:

    filefrom不是system.drawing.image成員

    startuppath不是system.windows.form.application成員

     

    這兩行是代表??

    我沒有印用對空間嘛??

     

    Imports System.Windows.Forms
    Imports System.Drawing

    以上是我引用的空間

    抱歉小弟功力還不夠,真是麻煩心冷大了 謝謝

    2008年10月23日 下午 03:02
  • Application.StartupPath 在 CF 中沒有,是 WinApp 的類別,這邊只是表示從應用程式路徑撈檔,請直接用絕對路徑測試。
    2008年10月23日 下午 03:16
  • 謝謝謝謝

      grfx.DrawImage(Image.FromFile("C:\test\emf\emf\res\icons\map_clor2.gif"), PictureBox1.ClientRectangle) <=我改的code

     

    最後 "Image.FromFile"這邊我try了好久

    還是不知道怎改ㄟ

    可以再提示我最後一步嘛

    感謝您了

     

    2008年10月23日 下午 03:22
  • grfx.DrawImage(Image.FromFile("C:\test\emf\emf\res\icons\map_clor2.gif"), PictureBox1.ClientRectangle) <=我的程式碼

    以下是錯誤顯示:

    fileform不是"system.drawing.image"的成員

     

    請問這行又要怎改了

    我try了很多次

    類別沒錯啊

    麻煩心冷大再給小弟最後一點提示了

    謝謝您

     

    2008年10月23日 下午 03:34
  • ...

    剛剛翻了一下線上手冊,Image.FromFile 並不被 CF 支援...

     

    你改成這樣試看看:

    Code Snippet

    grfx.DrawImage(New Bitmap("C:\test\emf\emf\res\icons\map_clor2.gif"), PictureBox1.ClientRectangle)

     

     

    2008年10月23日 下午 04:24
  • 心冷大您好

    VB   "說多載解析失敗,因為沒有可存取的"drawimage"接受此引數數目"

    請問是 drawimage後面沒有接受兩個引數語法的意思嘛???

     

    還是您有更完整的方法嘛??

    謝謝您了 就差最後一步了

     

    2008年10月24日 上午 07:15
  •  

    Windows Mobile 5,C#環境

    pictureBox.Image为Image型的 pictureBox.Image為Image型的

    而在.NET CF 2.0/3.5 中System.Drawing.Image并没有Image.FromFile(string   file)这样的方法。而在.NET CF 2.0/3.5中System.Drawing.Image並沒有Image.FromFile(string file)這樣的方法。

    为pictureBox加载Image.FromFile,可以通过如下方法。為pictureBox加載Image.FromFile,可以通過如下方法。

    //方法一 //方法一
    pictureBox1.Image =   new Bitmap( string file);

    //方法二  把图片作为可嵌入的资源 //方法二把圖片作為可嵌入的資源
    Bitmap   bm = Bitmapbm =     new Bitmap(Assembly.GetExcuteAssambly().GetManisfestResouseStream( " namespace.filename.jpg " );

     

    以下是我找到的網頁

    不過內容我不是很懂ㄟ 麻煩大大再幫我看一下了

    2008年10月24日 上午 07:22
  • CF 沒這個多載...

     

    那就自己改寫:

    Code Snippet

     

    myDrawImage(grfx, "你的圖檔", PictureBox1.ClientRectangle)

     

    Private Sub myDrawImage(ByVal grfx As Graphics, ByVal strImageFile As String, ByVal destRectangle As Rectangle)

         Dim sourceImage As New Bitmap(strImageFile)

         grfx.DrawImage(sourceImage, destRectangle, New Rectangle(0, 0, sourceImage.Width, sourceImage.Height), GraphicsUnit.Pixel)

         sourceImage.Dispose()

    End Sub

     

     

     

     

     

    2008年10月24日 上午 08:54
  • http://myweb.ncku.edu.tw/~n2696186/index.html

    這是我現在做出來的樣子

     

    底圖是用:

    Dim newImage As Bitmap

    ===============

         newImage = New Bitmap("C:\test\emf\emf\res\地圖.gif")

         Me.Refresh()

     

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

            If newImage Is Nothing Then Return
            Dim x As Integer = 1
            Dim y As Integer = 1

            Dim srcRect As New Rectangle(0, 0, 400, 450)
            Dim units As GraphicsUnit = GraphicsUnit.Pixel
            e.Graphics.DrawImage(newImage, x, y, srcRect, units)
            ' e.Graphics.DrawImage(newImage, 100, 100
        End Sub

     

    應該是您說用圖檔畫的方法吧

     

    小人的部份:

      Dim bmp As New Bitmap(PictureBox2.ClientSize.Width, PictureBox2.ClientSize.Height, PixelFormat.Format32bppRgb)

       Dim grfx As Graphics = Graphics.FromImage(bmp)

       myDrawImage(grfx, "C:\test\emf\emf\res\icons\我是小人.png", PictureBox2.ClientRectangle)

       PictureBox2.Image = bmp

     

    Private Sub myDrawImage(ByVal grfx As Graphics, ByVal strImageFile As String, ByVal destRectangle As Rectangle)

            Dim sourceImage As New Bitmap(strImageFile)

            grfx.DrawImage(sourceImage, destRectangle, New Rectangle(0, 0, sourceImage.Width, sourceImage.Height), GraphicsUnit.Pixel)

            sourceImage.Dispose()

        End Sub

     

    以上小人的做法應該是您說直接繪圖的方法吧

     

    可是出來為何小人的部份還是黑底啊 並沒有透到地圖上勒

    我是希望小人背景的部份可以透過去看到地圖,我有用Firework把背景色去掉過了

     

    請問一下原因可能是啥呢..??

    還是我小人的圖要您所謂的  32bit圖嘛???

    真是太麻煩您了 謝謝^^

    2008年10月24日 上午 10:43
  • 看不到圖片...

     

    32 bits color 是指宣告 bmp 時的這個:Format32bppRgb

     

    你小人旁的底色有用繪圖軟體確認過設定為透明色嗎?

     

    2008年10月24日 上午 11:42
  •  

    我有用iconxp轉過 32bit 背景透明

     

    不然請問一下 您是用啥軟體確認的呢???

    3Q

    2008年10月24日 下午 02:17
  • 我是用 IrfanView 處理圖檔,因為是 freeware ,從 ACDSee 開始收錢後我就跳槽到 IrfanView 了

    2008年10月24日 下午 02:39
  • 因為我的圖檔是別人給的 好像是8bit的gif跟png吧

    我剛剛有用iconxp處理過了  在iconxp裡面看到的明明是有透明

    可是一執行程式

    好像就沒有用 >< 快哭了

     

    那請問用IrfanView有辦法處理嘛??

    您也是用IrfanView把圖檔便透明的是嘛???

    2008年10月24日 下午 02:49
  •  藍星 寫信:

     

    方便的話 可以請您給我一張有透明的圖嘛

    讓我tryrty是我code的問題還是圖的問題嘛??

    因為我都try不出您講的效果

    也不曉得是我code的問題還是我圖片的問題...

    好困擾

    真的謝謝您了><""

    2008年10月24日 下午 03:48
  • 原圖 (png)

     

    疊完的圖 (png)

    2008年10月24日 下午 04:02
  •  

    您好,我疊完圖底色還是沒有透明ㄟ

    我想是我code有問題吧

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

               
    Dim bmp As New Bitmap(PictureBox2.ClientSize.Width, PictureBox2.ClientSize.Height, Imaging.PixelFormat.Format32bppRgb)

    Dim bmp2 As New Bitmap(PictureBox2.ClientSize.Width, PictureBox2.ClientSize.Height, Imaging.PixelFormat.Format32bppRgb)

     

            Dim grfx As Graphics = Graphics.FromImage(bmp)
            Dim grfx2 As Graphics = Graphics.FromImage(bmp2)

     

            myDrawImage(grfx, "C:\test\emf\emf\res\earth.png", PictureBox2.ClientRectangle)
            myDrawImage(grfx2, "C:\test\emf\emf\res\map_color.gif", PictureBox2.ClientRectangle)


            PictureBox2.Image = bmp2
            PictureBox2.Image = bmp
        End Sub

    Private Sub myDrawImage(ByVal grfx As Graphics, ByVal strImageFile As String, ByVal destRectangle As Rectangle)

       Dim sourceImage As New Bitmap(strImageFile)

       grfx.DrawImage(sourceImage, destRectangle, New Rectangle(0, 0, sourceImage.Width, sourceImage.Height), GraphicsUnit.Pixel)

       sourceImage.Dispose()

        End Sub

     

     請問那邊有錯嘛 ><"

    2008年10月25日 上午 02:12
  • 如果你把這些程式碼移回 Windows Form 正常的話,那就要換方法了,表示 CF 在透明色支援方式與 WinForm 不同...

    2008年10月25日 上午 05:24