#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main()
{
FILE* bmp = NULL;
uint32_t offset;
uint8_t* temp = NULL;
size_t read;
unsigned int x_dim = 600, y_dim = 388;
bmp = fopen("test_colour.bmp", "r");
if (!bmp)
return -1;
/* Get the image data offset */
fseek(bmp, 10, SEEK_SET);
fgets((char*)&offset, 4, bmp);
printf("Offset = %u\n", offset);
temp = malloc(3*x_dim*y_dim*sizeof(uint8_t));
if (!temp)
return -1;
/* Go the the position where the image data is stored */
fseek(bmp, offset, SEEK_SET);
/* Copy image data to array */
printf("%u bytes requested!\n", 3*x_dim*y_dim);
read = fread((void*)temp, sizeof(uint8_t), 3*x_dim*y_dim, bmp);
printf("%Iu bytes read!\n", read);
fclose(bmp);
free(temp);
return 0;
}
मैं उपरोक्त कोड का उपयोग 24-बिट प्रति पिक्सल बीएमपी छवि के आरजीबी डेटा को सरणी में पढ़ने के लिए कर रहा हूं। फ़ाइल की शुरुआत से ऑफसेट जहां छवि डेटा शुरू होता है (बीएमपी हेडर के बाद) बीएमपी विनिर्देश के अनुसार ऑफ़सेट 10 पर दिया जाता है। उपर्युक्त कोड निष्पादित करते समय मुझे निम्न आउटपुट मिलता है।फ़्रेड से अप्रत्याशित वापसी मूल्य()
Offset = 54
698400 bytes requested!
33018 bytes read!
ऑफ़सेट आउटपुट सही लगता है क्योंकि फ़ाइल का आकार 698454 बाइट्स (= 698400 + 54) है। हालांकि, fread()
द्वारा लौटाया गया मान इंगित करता है कि पूरे छवि डेटा को पढ़ा नहीं जा सकता है। हालांकि, मैं बाद में temp
सरणी में डेटा का उपयोग कर आरजीबी डेटा को ग्रेस्केल में परिवर्तित करने और इस डेटा को फिर से बीएमपी फ़ाइल में लिखने के लिए उपयोग कर रहा हूं। आउटपुट छवि की दृष्टि से जांच करने से कोई त्रुटि नहीं आती है, यानी ऐसा लगता है जैसे मैं वास्तव में पहली इनपुट छवि को पहले स्थान पर पढ़ता हूं हालांकि fread()
अलग-अलग संकेत मिलता है।
क्या कोई इस व्यवहार को समझा सकता है?
दो प्रश्न: 1) क्या आप 'fread' पर कॉल के बाद' temp' की सामग्री जांच सकते हैं, यह देखने के लिए कि क्या यह वास्तव में 33018 बाइट्स के बाद पढ़ना बंद कर दिया गया है? 2) मैं '% IU' प्रारूप विनिर्देशक से अपरिचित हूं - क्या आप डीबगर में 'read' के वास्तविक मान को देख सकते हैं? – Treb
मुझे नहीं लगता कि यह आपके द्वारा देखे जा रहे लक्षणों का कारण बन रहा है, लेकिन आपको सही 'printf' प्रारूप तारों का उपयोग करना चाहिए। 'Size_t' के लिए प्रारूप' "% zu" 'है। '"% Iu "' गैर-मानक है। यदि आपका कार्यान्वयन '% zu" का समर्थन नहीं करता है, तो आप 'printf ("% lu बाइट्स पढ़ सकते हैं! \ N", (हस्ताक्षरित लंबे) पढ़ सकते हैं); ' –
मैं संकलन करने के लिए मिनीजीडब्ल्यू के साथ जीसीसी का उपयोग कर रहा हूं और कंपाइलर '% zu' विनिर्देशक को पहचान नहीं करता है (मैंने पहले उस का उपयोग करने की कोशिश की थी)। मैंने पढ़ा है कि विंडोज़ में '% Iu' का उपयोग करना है। – simon