簡體   English   中英

BMP色彩反轉功能不起作用

[英]Function for BMP color inverting doesn't work

我寫了一些快速代碼,應該用來反轉BMP圖像的顏色。 我用油漆創建的40x40尺寸BMP圖像進行測試。 但是,該功能似乎完全用白色像素填充它。

void
negate
(char *FILE_NAME)
{
    FILE* fp = fopen(FILE_NAME, "r+b");
    uint_64 raw_data, i;

    fseek(fp, 35, SEEK_SET);
    //raw_data = fgetc(fp) + fgetc(fp)*256;
    raw_data = 4800; // calculated

    fseek(fp, 54, SEEK_SET);
    for(i = 54; i != 54 + raw_data; i++) // <=
    {
        int old = fgetc(fp);
        fseek(fp, i, SEEK_SET);
        fputc(255 - old, fp);
    }

    fclose(fp);
}

我在哪里弄錯了?

C11規范草案對此有此說法

當使用更新模式打開文件時(上面的模式參數值列表中的第二個或第三個字符“ +”),輸入和輸出都可以在關聯的流上執行。 但是,在沒有中間調用fflush函數或文件定位函數(fseek,fsetpos或rewind)的情況下,輸出之后不能直接輸入,在沒有中間調用文件位置的情況下,輸入之后不能直接輸出。函數,除非輸入操作遇到文件結尾。

將fseek添加到循環中可以解決此問題,盡管我不明白為什么:

for (i = 54; i != 54 + raw_data; i++) // <=
{
    fseek(fp, i, SEEK_SET);
    int old = fgetc(fp);

    fseek(fp, i, SEEK_SET);
    fputc(255 - old, fp);
}

在嘗試找出問題時,我這樣做是為了查看流中的位置是否正確:

for (i = 54; i != 54 + raw_data; i++) // <=
{
    long x = ftell(fp);
    printf("%d,", x);

    int old = fgetc(fp);

    fseek(fp, i, SEEK_SET);
    fputc(255 - old, fp);
}

確實是這樣。 它輸出54,55,56,57,...因此fseek()不必要! 但是,如果您查看fgetc()的結果,“舊”值似乎總是在讀取54處的像素。我認為@RSahu是正確的:請勿像這樣對一個文件進行讀寫。 最好將數據讀入緩沖區,然后取反緩沖區,然后將其寫入磁盤。 或完全寫入另一個文件。

也許這與緩沖有關?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM