none
想請教關於vb.net的繪圖問題 RRS feed

  • 問題

  •        
    imagefile = Image.FromFile(OpenFileDialog1.FileName)
    Dim g As Graphics = Graphics.FromImage(imagefile)
    g.DrawImage(imagefile, 0, 0)
    g.DrawLine(line_pen, line_start, line_end)
    g.DrawString(word, word_Font, word_brush, word_start)
    g.Dispose()
    PictureBox1.Image = imagefile

    這是我的部分程式碼,我是想在圖片上添加上文字與直線

    我遇到的問題有兩個

    1.只能讀取特定格式的檔案?
    我使用BMP檔案(640*480*32)格式的可以跑

    可是換成BMP檔案(640*480*8)

    會在下列程式碼出現:"無法從具備索引像素格式的影像中建立圖形物件 (Graphic Object)。

    Dim g As Graphics = Graphics.FromImage(imagefile)

    兩張圖好像是差在"每像素的位元",一個是32,一個是8,所以依照我的寫法只能在32位元才能跑

    有什麼方法可以解決呢??

    2.影像的DPI(每英吋像素),會影響到Drawstring畫出來的字體大小?

    Dim word_Font As Font = New Font("新細明體", 18, FontStyle.Bold) '顯示文字的格式

    我的字體設定如以上程式碼

    可是在不同張圖片上,繪出的字體大小會不相同,使繪出的線段(drawline)與文字(drawstring)重疊再一起

    我比較後的結論是,不同影像不同的DPI會影響到drawstring畫出來的字體大小

    有什麼方法可以解決呢?? 

    謝謝


    2013年1月25日 上午 10:44

解答

  • 1.先開一個空白 Bitmap 與你的圖檔同大

    2.用空白的 Bitmap 產生 Graphic

    3. 用此 Graphic.DrawImage 將非全彩的圖,畫到 Bitmap 。

    4.後面同你原始碼,只是用這個 Bitmap 。

    另外看一下 Font.Unit 說明。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 Darxme 2013年1月29日 上午 02:41
    2013年1月25日 下午 01:10
  • Hi,

    可以改用Bitmap建構子去做這樣的動作

    Dim newBitmap As Bitmap = New Bitmap(imagefile)

    或是DrawImage時帶入長寬

    g.DrawImage(imagefile, 0, 0, imagefile.Width, imagefile.Height)


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/

    • 已標示為解答 Darxme 2013年1月29日 上午 02:41
    2013年1月27日 下午 01:40
  • 線上手冊備註就有寫了...

    Graphics.DrawImage 方法 (Image, Int32, Int32)

    Image 會儲存像素寬度的值,以及水平解析度的值 (Dots Per Inch (DPI))。影像的實體寬度 (以英吋度量) 是像素寬度除以水平解析度。例如,像素寬度 216 而水平解析度 72 DPI 的影像具有 3 英吋的實體寬度。同樣的說法可以套用至像素高度和實體高度。

    DrawImage 方法會使用實體大小來繪製影像;因此,無論顯示裝置的解析度 (Dots Per Inch (DPI)) 如何,影像都將擁有正確的英吋大小。例如,假設影像有 216 的像素寬度和 72 DPI 的水平解析度。如果您呼叫 DrawImage 在 96 DPI 解析度的裝置上繪製該影像,所呈現影像的像素寬度將會是 (216/72)*96 = 288。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 Darxme 2013年2月3日 下午 01:04
    2013年1月31日 下午 12:01

所有回覆

  • 1.先開一個空白 Bitmap 與你的圖檔同大

    2.用空白的 Bitmap 產生 Graphic

    3. 用此 Graphic.DrawImage 將非全彩的圖,畫到 Bitmap 。

    4.後面同你原始碼,只是用這個 Bitmap 。

    另外看一下 Font.Unit 說明。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 Darxme 2013年1月29日 上午 02:41
    2013年1月25日 下午 01:10
  • 我之前有做過1~4這種寫法,大概如下

    imagefile = Image.FromFile(OpenFileDialog1.FileName)
    Dim newBitmap As Bitmap = New Bitmap(imagefile.Width, imagefile.Height)
    Dim g As Graphics = Graphics.FromImage(newBitmap)
    g.DrawImage(imagefile, 0, 0)
    g.DrawLine(line_pen, line_start, line_end)
    g.DrawString(word, word_Font, word_brush, word_start)
    g.Dispose()
    PictureBox1.Image = newBitmap

    不過我遇到的問題是畫出來的圖

    g.DrawImage(imagefile, 0, 0)

    比例會與原本使用OpenFileDialog1讀入PictureBox1中的影像不同
    下面左(OpenFileDialog1讀入原圖)、右(DrawImage重畫出來)

    看起來像是"放大後又被截掉",不太了解為什麼會這樣??

    2013年1月25日 下午 06:48
  • Hi,

    可以改用Bitmap建構子去做這樣的動作

    Dim newBitmap As Bitmap = New Bitmap(imagefile)

    或是DrawImage時帶入長寬

    g.DrawImage(imagefile, 0, 0, imagefile.Width, imagefile.Height)


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/

    • 已標示為解答 Darxme 2013年1月29日 上午 02:41
    2013年1月27日 下午 01:40
  • 謝謝

    結合 1.先開一個空白 Bitmap ,將圖畫到Bitmap上 與 2.DrawImage時帶入長寬

    解決了我的問題

    2013年1月29日 上午 02:44
  • DrawImage 本來就有多個多型...

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2013年1月29日 下午 04:57
  • to 心冷大大:

    我知道DrawImage 本來就有多個多型

    我本來認為

    g.DrawImage(imagefile, 0, 0)這樣的寫法就可以畫出imagefile

    不知道這樣畫出來的大小為什麼會不一樣

    一定要用g.DrawImage(imagefile, 0, 0, imagefile.Width, imagefile.Height) 才能畫出

    謝謝

    • 已編輯 Darxme 2013年1月31日 上午 11:20
    2013年1月31日 上午 11:17
  • 線上手冊備註就有寫了...

    Graphics.DrawImage 方法 (Image, Int32, Int32)

    Image 會儲存像素寬度的值,以及水平解析度的值 (Dots Per Inch (DPI))。影像的實體寬度 (以英吋度量) 是像素寬度除以水平解析度。例如,像素寬度 216 而水平解析度 72 DPI 的影像具有 3 英吋的實體寬度。同樣的說法可以套用至像素高度和實體高度。

    DrawImage 方法會使用實體大小來繪製影像;因此,無論顯示裝置的解析度 (Dots Per Inch (DPI)) 如何,影像都將擁有正確的英吋大小。例如,假設影像有 216 的像素寬度和 72 DPI 的水平解析度。如果您呼叫 DrawImage 在 96 DPI 解析度的裝置上繪製該影像,所呈現影像的像素寬度將會是 (216/72)*96 = 288。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 Darxme 2013年2月3日 下午 01:04
    2013年1月31日 下午 12:01