VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

不使用DLL取得圖片大小(轉貼)

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 1 樓

發表發表於: 星期六 三月 20, 2004 10:23 am    文章主題: 不使用DLL取得圖片大小(轉貼) 引言回覆

不使用DLL,返回圖片大小【重新上傳】

一個自定義函數,純vfp程序,返回圖片的高度和寬度
picsize(參數[,參數2])
參數說明:
參數1:字符型,指定需要返回大小的圖片文件名,如果文件不在當前搜索路徑下,請指定全路徑。
參數2:字符型可選參數,默認返回圖片寬度,當指定參數"h"時,返回圖片高度

返回值:數值型。
如果忽略第一個參數,或參數指定的文件不存在,返回0
忽略第二個參數,或第二個參數不是"h",返回圖片寬度,否則返回圖片高度

sample:
?picsize("c:\windows\tulips.jpg")
800
?picsize("c:\windows\tulips.jpg","h")
600
?picsize("c:\windows\")
0


代碼下載:

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 2 樓

發表發表於: 星期六 三月 20, 2004 7:30 pm    文章主題: 引言回覆

代碼:


********DECL
DO DECL
PRIVATE hMemDC, hMemBmp, lnWidth, lnHeight, lnBitsPerPixel,;
   lnBytesPerScan, lcBFileHdr, lcBIHdr, lpBitsArray, lnBitsSize,;
   lcRgbQuad, lnRgbQuadSize, lcBInfo, lnFileSize
STORE "" TO lcBIHdr, lcBInfo, lcRgbQuad
STORE 0 TO hMemDC, hMemBmp, lnWidth, lnHeight, lnFileSize,;
   lnBitsPerPixel, lnBytesPerScan, lnRgbQuadSize, lpBitsArray, lnBitsSize
= MakeSnapshot()
= InitBitmapInfo()
= InitBitsArray()
#DEFINE DIB_RGB_COLORS 0
= GetDIBits (hMemDC, hMemBmp, 0, lnHeight, lpBitsArray,;
   @lcBInfo, DIB_RGB_COLORS)

LOCAL lcFilename
**保存的文件名
lcFilename = "d:\myfile.bmp"
IF bmp2file (lcFilename)
   *ACTI SCREEN
   ? "File: ", lcFilename
   ? "Size: ", LTRIM(TRANS(lnFileSize, "999,999,999,999"))
   ? "Width: ", LTRIM(STR(lnWidth)) + " pixels"
   ? "Height: ", LTRIM(STR(lnHeight)) + " pixels"
   ? "Bits per pixel:", LTRIM(STR(lnBitsPerPixel))
ENDIF
= GlobalFree (lpBitsArray)
= DeleteObject (hMemBmp)
= DeleteDC (hMemDC)
RETURN && main
PROCEDURE InitBitmapInfo()
   #DEFINE BI_RGB 0
   #DEFINE RGBQUAD_SIZE 4 && RGBQUAD
   #DEFINE BHDR_SIZE 40 && BITMAPINFOHEADER
   * forcing 24-bit format
   lnBitsPerPixel = 24
   lnBytesPerScan = lnWidth * 3
   * line width should be DWORD-aligned (4 bytes)
   * important for 16- and 24-bit color palettes
   IF MOD(lnBytesPerScan, 4) <> 0
      lnBytesPerScan = lnBytesPerScan + 4 - MOD(lnBytesPerScan, 4)
   ENDIF
   * initializing BitmapInfoHeader structure
   lcBIHdr = num2dword(BHDR_SIZE) + num2dword(lnWidth) +;
      num2dword(lnHeight) + num2word(1) + num2word(lnBitsPerPixel) +;
      num2dword(BI_RGB) + num2dword(0) + num2dword(0) + num2dword(0) +;
      num2dword(0) + num2dword(0)
   * creating a buffer for the color table
   IF lnBitsPerPixel <= 8
      lnRgbQuadSize = (2^lnBitsPerPixel) * RGBQUAD_SIZE
      lcRgbQuad = REPLI(CHR(0), lnRgbQuadSize)
   ELSE
      lnRgbQuadSize = 0
      lcRgbQuad = ""
   ENDIF
   * merging two pieces together
   lcBInfo = lcBIHdr + lcRgbQuad
   RETURN
PROCEDURE InitBitsArray()
   #DEFINE GMEM_FIXED 0
   lnBitsSize = lnHeight * lnBytesPerScan
   lpBitsArray = GlobalAlloc (GMEM_FIXED, lnBitsSize)
   = ZeroMemory (lpBitsArray, lnBitsSize)
FUNCTION bmp2file (lcTargetFile)
   * store all gathered pieces to a disk file
   #DEFINE GENERIC_WRITE 1073741824 && 0x40000000
   #DEFINE FILE_SHARE_WRITE 2
   #DEFINE CREATE_ALWAYS 2
   #DEFINE FILE_ATTRIBUTE_NORMAL 128
   #DEFINE INVALID_HANDLE_VALUE -1
   #DEFINE BFHDR_SIZE 14 && BITMAPFILEHEADER
   LOCAL hFile, lnOffBits
   * resulting BMP file size
   lnFileSize = BFHDR_SIZE + BHDR_SIZE + lnRgbQuadSize + lnBitsSize
   * offset to the bitmap bits
   lnOffBits = BFHDR_SIZE + BHDR_SIZE + lnRgbQuadSize

   * BMP file header
   lcBFileHdr = "BM" + num2dword(lnFileSize) +;
      num2dword(0) + num2dword(lnOffBits)

   * target file handle
   hFile = CreateFile (lcTargetFile,;
      GENERIC_WRITE,;
      FILE_SHARE_WRITE, 0,;
      CREATE_ALWAYS,;
      FILE_ATTRIBUTE_NORMAL, 0)
   IF hFile <> INVALID_HANDLE_VALUE
      * a straightforward process of storing block after block:
      = String2File (hFile, @lcBFileHdr) && BitmapFileHeader
      = String2File (hFile, @lcBInfo) && BitmapInfo
      = Ptr2File (hFile, lpBitsArray, lnBitsSize) && bitmap data
      = CloseHandle (hFile)
      RETURN .T.
   ELSE
      = MESSAGEB ("Unable to create file: " + lcTargetFile)
      RETURN .F.
   ENDIF
PROCEDURE String2File (hFile, lcBuffer)
   * appends string buffer to a file
   DECLARE INTEGER WriteFile IN kernel32;
      INTEGER hFile, STRING @lpBuffer, INTEGER nBt2Write,;
      INTEGER @lpBtWritten, INTEGER lpOverlapped
   = WriteFile (hFile, @lcBuffer, LEN(lcBuffer), 0, 0)
   RETURN
PROCEDURE Ptr2File (hFile, lnPointer, lnBt2Write)
   * appends memory block to a file
   DECLARE INTEGER WriteFile IN kernel32;
      INTEGER hFile, INTEGER lpBuffer, INTEGER nBt2Write,;
      INTEGER @lpBtWritten, INTEGER lpOverlapped
   = WriteFile (hFile, lnPointer, lnBt2Write, 0, 0)
   RETURN
PROCEDURE MakeSnapshot()
   #DEFINE SRCCOPY 13369376
   LOCAL HWND, hdc, hSavedBitmap
   HWND = GetFocus()
   hdc = GetWindowDC(HWND)
   = GetWinRect(HWND, @lnWidth, @lnHeight)
   hMemDC = CreateCompatibleDC (hdc)
   hMemBmp = CreateCompatibleBitmap (hdc, lnWidth, lnHeight)
   hSavedBitmap = SelectObject (hMemDC, hMemBmp)
   = BitBlt (hMemDC, 0,0, lnWidth,lnHeight, hdc, 0,0, SRCCOPY)
   = SelectObject (hMemDC, hSavedBitmap)
   = ReleaseDC (HWND, hdc)
   RETURN
PROCEDURE GetWinRect(HWND, lnWidth, lnHeight)
   #DEFINE MAX_DWORD 4294967295 && 0xffffffff
   LOCAL lpRect, lnLeft, lnTop, lnRight, lnBottom
   lpRect = REPLI(CHR(0), 16)
   = GetWindowRect (HWND, @lpRect)
   lnLeft = buf2dword(SUBSTR(lpRect, 1,4))
   lnTop = buf2dword(SUBSTR(lpRect, 5,4))
   lnRight = buf2dword(SUBSTR(lpRect, 9,4))
   lnBottom = buf2dword(SUBSTR(lpRect, 13,4))
   IF lnLeft > lnRight
      lnLeft = lnLeft - MAX_DWORD
   ENDIF
   IF lnTop > lnBottom
      lnTop = lnTop - MAX_DWORD
   ENDIF

   lnWidth = lnRight - lnLeft
   lnHeight = lnBottom - lnTop
   RETURN
FUNCTION num2dword (lnValue)
   #DEFINE m0 256
   #DEFINE m1 65536
   #DEFINE m2 16777216
   LOCAL b0, b1, b2, b3
   b3 = INT(lnValue/m2)
   b2 = INT((lnValue - b3*m2)/m1)
   b1 = INT((lnValue - b3*m2 - b2*m1)/m0)
   b0 = MOD(lnValue, m0)
   RETURN CHR(b0)+CHR(b1)+CHR(b2)+CHR(b3)
FUNCTION num2word (lnValue)
   RETURN CHR(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))
FUNCTION buf2dword (lcBuffer)
   RETURN ASC(SUBSTR(lcBuffer, 1,1)) + ;
      ASC(SUBSTR(lcBuffer, 2,1)) * 256 +;
      ASC(SUBSTR(lcBuffer, 3,1)) * 65536 +;
      ASC(SUBSTR(lcBuffer, 4,1)) * 16777216
FUNCTION buf2word (lcBuffer)
   RETURN ASC(SUBSTR(lcBuffer, 1,1)) + ;
      ASC(SUBSTR(lcBuffer, 2,1)) * 256
PROCEDURE DECL
   DECLARE INTEGER GetDIBits IN gdi32;
      INTEGER hdc, INTEGER hbmp, INTEGER uStartScan,;
      INTEGER cScanLines, INTEGER lpvBits, STRING @lpbi,;
      INTEGER uUsage
   DECLARE INTEGER GlobalAlloc IN kernel32 INTEGER wFlags, INTEGER dwBytes
   DECLARE INTEGER GetWindowRect IN user32 INTEGER HWND, STRING @lpRect
   DECLARE INTEGER SelectObject IN gdi32 INTEGER hdc, INTEGER hObject
   DECLARE INTEGER ReleaseDC IN user32 INTEGER HWND, INTEGER hdc
   DECLARE INTEGER DeleteDC IN gdi32 INTEGER hdc
   DECLARE INTEGER GetFocus IN user32
   DECLARE INTEGER GetWindowDC IN user32 INTEGER HWND
   DECLARE INTEGER GlobalFree IN kernel32 INTEGER HMEM
   DECLARE INTEGER DeleteObject IN gdi32 INTEGER hObject
   DECLARE INTEGER CreateCompatibleDC IN gdi32 INTEGER hdc
   DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
   DECLARE RtlZeroMemory IN kernel32 AS ZeroMemory;
      INTEGER DEST, INTEGER numBytes
   DECLARE INTEGER CreateCompatibleBitmap IN gdi32;
      INTEGER hdc, INTEGER nWidth, INTEGER nHeight
   DECLARE INTEGER BitBlt IN gdi32;
      INTEGER hDestDC, INTEGER x, INTEGER Y,;
      INTEGER nWidth, INTEGER nHeight, INTEGER hSrcDC,;
      INTEGER xSrc, INTEGER ySrc, INTEGER dwRop
   DECLARE INTEGER CreateFile IN kernel32;
      STRING lpFileName, INTEGER dwDesiredAccess,;
      INTEGER dwShareMode, INTEGER lpSecurityAttr,;
      INTEGER dwCreationDisp, INTEGER dwFlagsAndAttrs,;
      INTEGER hTemplateFile
   *** The structures used in this code:
   *| typedef struct tagBITMAPINFOHEADER{
   *| DWORD biSize; 0:4
   *| LONG biWidth; 4:4
   *| LONG biHeight; 8:4
   *| WORD biPlanes; 12:2
   *| WORD biBitCount; 14:2
   *| DWORD biCompression; 16:4
   *| DWORD biSizeImage; 20:4
   *| LONG biXPelsPerMeter; 24:4
   *| LONG biYPelsPerMeter; 28:4
   *| DWORD biClrUsed; 32:4
   *| DWORD biClrImportant; 36:4 = 40 bytes
   *| } BITMAPINFOHEADER, *PBITMAPINFOHEADER
   *| typedef struct tagRGBQUAD {
   *| BYTE rgbBlue;
   *| BYTE rgbGreen;
   *| BYTE rgbRed;
   *| BYTE rgbReserved;
   *| } RGBQUAD; total 4 bytes
   *| typedef struct tagBITMAPINFO {
   *| BITMAPINFOHEADER bmiHeader;
   *| RGBQUAD bmiColors[1];
   *|} BITMAPINFO, *PBITMAPINFO;
   *| typedef struct tagBITMAPFILEHEADER {
   *| WORD bfType; 0:2
   *| DWORD bfSize; 2:4
   *| WORD bfReserved1; 6:2
   *| WORD bfReserved2; 8:2
   *| DWORD bfOffBits; 10:4 = 14 bytes
   *| } BITMAPFILEHEADER, *PBITMAPFILEHEADER;

   *********************************************

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作