Consultor Eletrônico



Kbase P110788: How to get the pixel height and width of a JPG image without loading the image?
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   15/11/2005
Status: Unverified

GOAL:

How to get the pixel height and width of a JPG image without loading the image?

FIX:

The following code reads the JPEG file directly and uses the JPEG file structure to access and output the pixel height and width of the specified JPG image without having to load that image:
DEFINE VARIABLE iBitsPerPixel AS INTEGER NO-UNDO.
DEFINE VARIABLE iPixelHeight AS INTEGER NO-UNDO.
DEFINE VARIABLE iPixelWidth AS INTEGER NO-UNDO.
DEFINE VARIABLE iColorPlanes AS INTEGER NO-UNDO.
DEFINE VARIABLE iJPEGTYPE AS INTEGER NO-UNDO.
DEFINE VARIABLE lInfo_JPEG AS LOGICAL NO-UNDO.
DEFINE VARIABLE iTempVar1 AS INTEGER NO-UNDO.
DEFINE VARIABLE iTempVar2 AS INTEGER NO-UNDO.
DEFINE VARIABLE iMarker AS INTEGER NO-UNDO.
DEFINE VARIABLE iLength AS INTEGER NO-UNDO.
DEFINE VARIABLE iCase AS INTEGER NO-UNDO.
DEFINE VARIABLE cFileName AS CHARACTER NO-UNDO.
DEFINE VARIABLE mPointer AS MEMPTR NO-UNDO.
DEFINE VARIABLE iPosition AS INTEGER NO-UNDO.
FUNCTION getNextByte RETURNS INTEGER (INPUT parm1 AS INTEGER) FORWARD.
FUNCTION getLength RETURNS INTEGER (INPUT parm1 AS INTEGER) FORWARD.
ASSIGN
cFileName = "C:\ApacheGroup\Tomcat4.1\server\webapps\admin\images\Login.jpg"
FILE-INFO:FILE-NAME = cFileName
SET-SIZE(mPointer) = FILE-INFO:FILE-SIZE
iPosition = 1.
INPUT FROM VALUE(cFileName) BINARY NO-CONVERT.
IMPORT UNFORMATTED mPointer.
ASSIGN
iTempVar1 = getNextByte(iPosition)
iTempVar2 = getNextByte(iPosition).
IF iTempVar1 = 255 AND iTempVar2 = 216 THEN REPEAT:
ASSIGN
iTempVar1 = getNextByte(iPosition)
iMarker = getNextByte(iPosition).
IF (iMarker GE 192 AND iMarker LE 195) OR (iMarker GE 197 AND iMarker LE 207) THEN iCase = 1.
ELSE IF (iMarker GE 216 AND iMarker LE 218) OR (iMarker EQ -1) THEN iCase = 2.
CASE iCase:
WHEN 1 THEN DO:
ASSIGN
iLength = getLength(iPosition)
iBitsPerPixel = getNextByte(iPosition)
iPixelHeight = getLength(iPosition)
iPixelWidth = getLength(iPosition)
iColorPlanes = getLength(iPosition)
iJPEGTYPE = iMarker
lInfo_JPEG = TRUE.
LEAVE.
END.
WHEN 2 THEN DO:
LEAVE.
END.R> OTHERWISE DO:
iLength = getLength(iPosition).
IF iLength LT 2 THEN LEAVE.
SEEK INPUT TO SEEK(INPUT) + iLength - 2.
END.
END CASE.
END.
MESSAGE iPixelWidth iPixelHeight
VIEW-AS ALERT-BOX INFO BUTTONS OK.
INPUT CLOSE.
FUNCTION getNextByte RETURNS INTEGER (INPUT ipPosition AS INTEGER).
DEFINE VARIABLE iTemp AS INTEGER NO-UNDO.

ASSIGN
iTemp = GET-BYTE(mPointer, iPosition)
iPosition = iPosition + 1.
RETURN iTemp.
END FUNCTION.

FUNCTION getLength RETURNS INTEGER (INPUT parm1 AS INTEGER).
DEFINE VARIABLE iTemp AS INTEGER NO-UNDO.

ASSIGN
iTempVar1 = getNextByte(iPosition)
iTempVar2 = getNextByte(iPosition)
iTemp = iTempVar1 * 256 + iTempVar2.
RETURN iTemp.
END FUNCTION.
.