Implementing Exif Features (original) (raw)

Cleans up the comment array.

BITMAPHANDLE LeadBitmap; /* Bitmap handle for the image */ void TestFunction(HWND hWnd, L_TCHAR *szFilename ) { L_CHAR * pCommentToGet; /* Comment string that we will get */ HGLOBAL hCommentToGet; /* Handle for memory management */ L_INT CommentLength; /* Length of the string */ L_UCHAR CommentToSet[80]; /* Comment string that we will set */ L_CHAR * pCommentToSet = CommentToSet; L_UCHAR szUserComment[80]; /* User comment that we will add */ L_CHAR * pUserComment = szUserComment; L_UINT32 * pDistance; /* Pointer for the Exif RATIONAL */ L_UINT32 Numerator, Denominator; /* Components of the Exif RATIONAL */ float fDistance; /* Result of the distance calculation */ L_TCHAR szMessage[256]; /* MessageBox string */ L_TCHAR szBuf[80]; L_INT i; /* Loop counter */ /* Load the bitmap */ L_LoadBitmap (szFilename, &LeadBitmap, sizeof(BITMAPHANDLE), 0, ORDER_BGR, NULL, NULL); /* Load the current comments from the file */ for(i = 0 ; i < CMNT_LAST ; i++ ) { /* Clear the comment */ L_SetComment(i, NULL, 0); /* Use the return value to get the length of a comment in the file */ CommentLength = L_ReadFileComment(szFilename, i, NULL, 0, NULL); if (CommentLength > 0) { /* Allocate and lock a zero-filled buffer for the comment */ hCommentToGet = GlobalAlloc(GHND, CommentLength); pCommentToGet = (L_UCHAR *)GlobalLock( hCommentToGet ); /* Get the comment from the file */ L_ReadFileComment(szFilename, i, pCommentToGet, CommentLength, NULL); /* Set the comment to be saved */ L_SetComment(i, pCommentToGet, CommentLength); /* Unlock and free memory */ GlobalUnlock( hCommentToGet ); GlobalFree(hCommentToGet); } } /* Reverse the image */ L_ReverseBitmap(&LeadBitmap); /* Create the CMNT_USERCOMMENT comment as a byte array */ L_SetComment(CMNT_USERCOMMENT, NULL, 0); pUserComment = "The image has been reversed."; pCommentToSet[0] = 'A'; pCommentToSet[1] = 'S'; pCommentToSet[2] = 'C'; pCommentToSet[3] = 'I'; pCommentToSet[4] = 'I'; pCommentToSet[5] = '\0'; pCommentToSet[6] = '\0'; pCommentToSet[7] = '\0'; for( i = 0; pUserComment[i] != '\0'; i++) { pCommentToSet[i+8] = pUserComment[i]; } pCommentToSet[i+8] = '\0'; /* Set the CMNT_USERCOMMENT comment */ L_SetComment(CMNT_USERCOMMENT, pCommentToSet, strlen(pUserComment) + 9); /* Save the image as an Exif file */ L_SaveBitmap(szFilename, &LeadBitmap, FILE_EXIF, 24, 0, NULL); /* Initialize the message string */ szMessage[0] = '\0'; /* Use the return value to get the length of the CMNT_SUBJECTDISTANCE comment */ /* This shows how to translate the Exif RATIONAL data type */ CommentLength = L_ReadFileComment(szFilename, CMNT_SUBJECTDISTANCE, NULL, 0, NULL); if (CommentLength > 0) { /* Allocate and lock a zero-filled buffer for the comment */ hCommentToGet = GlobalAlloc(GPTR, CommentLength); pCommentToGet = (L_UCHAR *)GlobalLock( hCommentToGet ); /* Get the actual comment from the file */ L_ReadFileComment(szFilename, CMNT_SUBJECTDISTANCE, pCommentToGet, CommentLength, NULL); pDistance = (L_UINT32 *)pCommentToGet; Numerator = pDistance[0]; Denominator = pDistance[1]; fDistance = (float)Numerator / (float)Denominator; wsprintf (szMessage, TEXT("Subject distance: %.6f\n"),fDistance ); /* Unlock and free memory */ GlobalUnlock( hCommentToGet ); GlobalFree(hCommentToGet); } /* Use the return value to get the length of the CMNT_USERCOMMENT comment */ CommentLength = L_ReadFileComment(szFilename, CMNT_USERCOMMENT, NULL, 0, NULL); if (CommentLength > 0) { /* Allocate and lock a zero-filled buffer for the comment */ hCommentToGet = GlobalAlloc(GPTR, CommentLength); pCommentToGet = (L_UCHAR *)GlobalLock( hCommentToGet ); /* Get the actual comment from the file */ L_ReadFileComment(szFilename, CMNT_USERCOMMENT, pCommentToGet, CommentLength, NULL); /* If the prefix is ASCII, move the pointer and update the message string */ if (strcmp(pCommentToGet,"ASCII")== 0) { pCommentToGet = pCommentToGet + 8; } wsprintf (szBuf, TEXT("%hs"), pCommentToGet); lstrcat(szMessage, szBuf); /* Unlock and free memory */ GlobalUnlock( hCommentToGet ); GlobalFree(hCommentToGet); } /* Show the two comments */ MessageBox (NULL, szMessage, TEXT("Notice"), MB_OK); /* Clear the comments */ for(i = 0 ; i < CMNT_LAST ; i++ ) L_SetComment(i, NULL, 0); /* Force a repaint */ SendMessage (hWnd, WM_QUERYNEWPALETTE, 0, 0L); return; }