如何在PB中获取图像的宽度和高度

时间:2012-10-26 10:06:18

标签: height width powerbuilder

我正在使用PB8.0,我希望获得图片的宽度和高度,以便在DW中调整我的图片大小。你知道怎么做吗?

我搜索一个例子来获取位图文件的宽度和高度。对于位图文件似乎是正确的,但对于.jpg,.gif

等其他文件似乎不正确

请帮帮我

//Getting a Bitmaps Width and Height 
int     li_job
blob    b
string  ls_ext

ls_ext = lower(Right(as_filename, 3))
CHOOSE CASE ls_ext
  CASE 'bmp'
    li_job = FileOpen( "filename.bmp", StreamMode!, Read! )
    IF li_job > 0 THEN
      FileRead( li_job, b )

      arl_Width  = Long(Integer( BlobMid( b, 19, 2 ) ), &
                   Integer( BlobMid( b, 21, 2) ) )
      arl_Height = Long(Integer( BlobMid( b, 23, 2 ) ), &
                   Integer( BlobMid( b, 25, 2) ) )
      FileClose( li_job )
    ELSE
      RETURN -1
    END IF
  CASE ELSE
    RETURN -1
END CHOOSE
RETURN 1

由于

3 个答案:

答案 0 :(得分:3)

图像大小的偏移量取决于文件格式。您使用的值对BMP format有效,但对另一种格式有效。

您需要单独搜索需要处理的任何文件格式。有些信息可供here使用。一个类似的例子,用于VB处理JPEG,GIF,BMP和& PNG可用here

此外,您可以通过Windows图像API获取一些信息,但我没有可用的示例。

答案 1 :(得分:2)

一种方法是将Picture控件添加到未选中可见属性并选中OriginalSize的窗口。

设置图片名称以加载图片,高度和宽度可用于处理。

// p_1 is not visible
p_1.PictureName = "c:\temp\pbHowTo.jpg"

MessageBox("height", p_1.height)
MessageBox("width", p_1.width)

您可能需要转换像素值,因为它们位于PbUnit中。

height_pixel = UnitsToPixels(p_1.height, YUnitsToPixels!)
width_pixel =  UnitsToPixels(p_1.width, XUnitsToPixels!)

Picture控件支持.BMP,GIF,.JPG和PNG文件。

答案 2 :(得分:0)

以下是获取JPG宽度和高度的代码:

//JPG

li_file = FileOpen(as_file_name, StreamMode!, Read! )
If li_file = -1 Then Return 0

li_read = FileRead (li_file, lb_data)  

If String (BlobMid (lb_Data, 1,3)) = Char (255) + Char (216) + Char (255) Then //JPG

    ll_DataLen = Len(lb_Data)   
    ll_DataPos = 3
    ll_FilePos = 3
    lb_LoopFlag = true
    Do While lb_LoopFlag
        ll_DataPos = ll_DataPos + 1
        ll_FilePos = ll_FilePos + 1
        li_Char1 = Asc (String (BlobMid(lb_Data, ll_DataPos, 1)))
        li_Char2 = Asc (String (BlobMid(lb_Data, ll_DataPos + 1, 1)))

        If li_Char1 = 255 And li_Char2 <> 255 Then
            If li_Char2 >= 192 And li_Char2 <= 195 Then
                al_width = Asc (String (BlobMid (lb_Data, ll_DataPos + 7,1))) * 256 + Asc (String (BlobMid (lb_Data, ll_DataPos + 8,1)))
                al_height= Asc (String (BlobMid (lb_Data, ll_DataPos + 5,1))) * 256 + Asc (String (BlobMid (lb_Data, ll_DataPos + 6,1))) 
                lb_LoopFlag= False
            Else   
                ll_FilePos = ll_FilePos + Asc (String (BlobMid(lb_Data, ll_DataPos + 3, 1))) + Asc (String (BlobMid(lb_Data, ll_DataPos + 2, 1))) + 1
                If ll_FilePos > ll_FileLength Then   
                    Exit   
                Else
                    FileSeek(li_file, ll_FilePos)   
                    FileRead(li_file, lb_Data)   
                    ll_DataLen = Len(lb_Data)   
                    ll_DataPos = 0   
                End If   
            End If   
        End If

        If ll_DataPos = ll_DataLen - 9 And lb_LoopFlag = True Then   
            ll_FilePos = ll_FilePos - 9   
            FileSeek(li_file, ll_FilePos)   
            FileRead(li_file, lb_Data)   
            ll_DataLen = Len(lb_Data)   
            ll_DataPos = 0   
        End If
        If ll_FilePos >= ll_FileLength Then   
            lb_LoopFlag = False   
        End If   
    Loop
End If

对于GIF:

al_width = Asc(String (BlobMid (lb_Data, 7,1))) + Asc (String (BlobMid (lb_Data, 8,1))) * 256
al_height = Asc (String (BlobMid (lb_Data, 9,1))) + Asc (String (BlobMid (lb_Data, 10,1))) * 256