JPG-Kommentar setzen

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

JPG-Kommentar setzen

Beitrag von Markus Walter »

Hi,

kennt jemand eine Möglichkeit (OCX?) bei einer JPG-Datei den JPG-Kommentar zu setzen?
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: JPG-Kommentar setzen

Beitrag von AUGE_OHR »

hi,
Markus Walter hat geschrieben: kennt jemand eine Möglichkeit (OCX?) bei einer JPG-Datei den JPG-Kommentar zu setzen?
hab mich in der letzen Zeit auch mit JPG beschäftigt und etwas gefunden
womit man die EXIF Kommentare "lesen" kann. Nun müsste man das auf
"schreiben" umbaun ...

gruss by OHR
Jimmy

Code: Alles auswählen

#include 'Directry.ch'			// Directory Array Definitions
#include 'FileIO.ch'			// Low-Level File Access Definitions

#define SOI_MARKER				chr(255) + chr(216)		// FFD8 -- Start Of Image Marker
#define EOI_MARKER				chr(255) + chr(217)		// FFD9 -- End Of Image Marker
#define JFIF_MARKER				chr(255) + chr(224)		// FFE0 -- JFIF ==> JPEG File Interchange Format Marker
#define EXIF_MARKER				chr(255) + chr(225)		// FFE1 -- EXIF ==> Extended (TIFF) Interchange Format Marker
#define JFIF_SIGNATURE			"JFIF" + chr(0)
#define EXIF_SIGNATURE			"Exif" + chr(0) + chr(0)

Procedure Main(cDir)
LOCAL cPath  := iif(cDir == NIL, CurDrive() + ":" + CurDir(CurDrive()), cDir) + ""
LOCAL aFiles := Directory(cPath + "*.*")
	Set Alternate To "Picture.lst" ; Set Alternate On
	aFiles := ASort(aFiles, , , {|aFile1, aFile2| aFile1[F_NAME] < aFile2[F_NAME]})
	AEval(aFiles, {|aFile| ListJPEGData(aFile[F_NAME], cPath)})
	Set Alternate To ; Set Alternate Off
return

Procedure ListJPEGData(cFileName, cPath)
LOCAL nLength  := 0		// 2 bytes: Length of Marker Header
LOCAL nMajVers := 0		// 1 bytes: (01)
LOCAL nMinVers := 0		// 1 bytes: (02)
LOCAL nUnits   := 0		// 1 byte: 0 = Aspect Ratio, 1 = DPI (Inches), 2 = DPC (cm)
LOCAL nXSize   := 0		// 2 bytes
LOCAL nYSize   := 0		// 2 bytes
LOCAL nFileLen := 0		// Length of JPEG File
LOCAL nHandle  := 0
LOCAL lValid   := .f.
LOCAL cText    := Space(2)
	QOut('File: "' + cFileName + '"')
	if (nHandle  := FOpen(cPath + cFileName, FO_READ + FO_SHARED)) > 0
		nTextLen := FSeek(nHandle, 0, FS_END) ; FSeek(nHandle, 0, FS_SET)
		if (lValid := FRead(nHandle, @cText, 2) == 2 .and. cText == SOI_MARKER)
			FSeek(nHandle, -2, FS_END)
			if (lValid := FRead(nHandle, @cText, 2) == 2 .and. cText == EOI_MARKER)
				if (nLength := FindJPEGMarker(nHandle, JFIF_MARKER)) > 0
					cText := Space(nLength)
					if FRead(nHandle, @cText, nLength) == nLength
						nOffSet := len(JFIF_SIGNATURE)
						if left(cText, nOffSet) == JFIF_SIGNATURE
							nMajVers := asc(cText[++nOffSet])
							nMinVers := asc(cText[++nOffSet])
							nUnits   := asc(cText[++nOffSet])
							nXSize   := asc(cText[++nOffSet]) * 256 + asc(cText[++nOffSet])
							nYSize   := asc(cText[++nOffSet]) * 256 + asc(cText[++nOffSet])
							QQOut(" -- X/Y " + iif(nUnits == 1 .or. nUnits == 2, "Resolution", "Aspect-Ratio") + ": " + alltrim(str(nXSize)) + "/" + alltrim(str(nYSize)) + iif(nUnits == 1, " DPI", iif(nUnits == 2, " DPC", "")))
						else
							QQOut(' -- Not a valid JFIF file...')
						endif
					else
						QQOut(" -- Invalid/Corrupted JFIF Header...")
					endif
				elseif (nLength := FindJPEGMarker(nHandle, EXIF_MARKER)) > 0
					cText := Space(nLength)
					if FRead(nHandle, @cText, nLength) == nLength
						nOffSet := len(EXIF_SIGNATURE)
						if left(cText, nOffSet) == EXIF_SIGNATURE
							QQOut(" -- Can't (yet) deceipher EXIF Application Markers...")
						else
							QQOut(' -- Not a valid EXIF file...')
						endif
					else
						QQOut(" -- Invalid/Corrupted EXIF Header...")
					endif
				else
					QQOut(" -- Could not find valid (JFIF/EXIF) Application Marker...")
				endif
			endif
		endif
		FClose(nHandle)
	endif
	if .not. lValid
		QQOut(" -- Not a valid JPEG file...")
	endif
return

Function FindJPEGMarker(nHandle, cMarker)
LOCAL nLength := 0
LOCAL cHeader := Space(2)
LOCAL cBuffer := Space(2)
	FSeek(nHandle, 2, FS_SET)
	while FRead(nHandle, @cHeader, 2) == 2 .and. cHeader # EOI_MARKER
		if FRead(nHandle, @cBuffer, 2) == 2
			nLength := asc(cBuffer[1]) * 256 + asc(cBuffer[2]) - 2
			if cHeader == cMarker
				exit
			else
				cHeader := Space(2)
				cBuffer := Space(nLength)
				if FRead(nHandle, @cBuffer, nLength) # nLength
					nLength := 0 ; exit
				endif
				nLength := 0
			endif
		else
			nLength := 0 ; exit
		endif
	enddo
return (nLength)
Antworten