2

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

ありがとう

4

3 に答える 3

3

画像サイズのオフセットは、ファイル形式によって異なります。使用している値はBMP形式では有効ですが、別の形式では異なります。

処理する必要のあるファイル形式を個別に検索する必要があります。いくつかの情報はここにあります。VBがJPEG、GIF、BMP、およびPNGを処理するための同様の例は、こちらから入手できます。

また、WindowsイメージAPIを介していくつかの情報を取得することもできますが、利用できる例はありません。

于 2012-10-26T11:42:55.183 に答える
2

1つの方法は、visibleプロパティがチェックされておらず、OriginalSizeがチェックされているウィンドウにPictureコントロールを追加することです。

画像をロードするために画像名を設定すると、高さと幅が処理に使用できるようになります。

// 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ファイルをサポートします。

于 2012-10-27T12:33:20.740 に答える
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
于 2016-04-01T06:16:12.493 に答える