English 中文(简体)
C中BMP进口时的平衡问题
原标题:Wrap-around issues when importing a BMP in C

我现在就为我的视觉信息处理课程制定一个方案。 我们重新给出了所有家庭工程的骨干模板,因为这个班子的重心是学习中产阶级。 I program on a Mac and t have access to the Window s Library which make import BMPs accessible. 因此,我已经使用(稍作修改)这一网站的代码:paulbourke.net/dataformats/bmp/

过去一年来,我实际上一直在使用这一法典,并且对24倍的BMP(即有色人种作为RGB)进行了罚款。 我需要对守则作出重大调整,增加了一种特殊的例行做法,如果将BMP的高度表示为负数的话,就会破坏图像的row。

当我把BMP进口到一系列GLubyte时,图像有BitCount = 24,使用GLDrawPixels进行完美的工作:

https://i.stack.imgur.com/aL3JN.png

然而,当我进口BitCount=8的BMP并使用GLDrawPixels显示其时,我收到以下信息(注意到红 rec中突出的包皮错误):

https://i.stack.imgur.com/PQv7i.png

我必须执行“德国”、“德国”、“德国”、“德国”、“德国”、“德国”、“德国”、“德国”、“德国”、“德国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国”、“美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、瑞典、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、美国、 页: 1 这是因为“区域”、“区域”、“区域”、“区域”和“区域”应当做到。 大会和会议管理部印发

我通过我的法典 s笑了一段时期,我可以 life笑我的生活,说明造成这一问题的原因。

进口后显示BMP的代码如下:

void drawBMP(BITMAPINFO *bitmapInfo, GLubyte *bitmapIn, GLfloat xOffset, GLfloat yOffset) {
if (bitmapInfo) {
    glRasterPos2f(xOffset, yOffset);

    if (bitmapInfo->bmiHeader.biBitCount == 24) {
        glDrawPixels(bitmapInfo->bmiHeader.biWidth,
                     bitmapInfo->bmiHeader.biHeight,
                     GL_BGR, GL_UNSIGNED_BYTE, bitmapIn);
    } else {
        glDrawPixels(bitmapInfo->bmiHeader.biWidth,
                     bitmapInfo->bmiHeader.biHeight,
                     GL_LUMINANCE, GL_UNSIGNED_BYTE, bitmapIn);
    }
}

glFinish();
}

也许GL_LUMINHAN正在造成这一问题?

在实际进口BMP的职能中:

GLubyte *                          /* O - Bitmap data */
LoadDIBitmap(const char *filename, /* I - File to load */
         BITMAPINFO **info)    /* O - Bitmap information */
{
FILE             *fp;          /* Open file pointer */
GLubyte          *bits;        /* Bitmap pixel bits */
GLubyte          *ptr;         /* Pointer into bitmap */
GLubyte          temp;         /* Temporary variable to swap red and blue */
int              x, y;         /* X and Y position in image */
int              length;       /* Line length */
int              bitsize;      /* Size of bitmap */
int              infosize;     /* Size of header information */
BITMAPFILEHEADER header;       /* File header */


/* Try opening the file; use "rb" mode to read this *binary* file. */
if ((fp = fopen(filename, "rb")) == NULL)
    return (NULL);

/* Read the file header and any following bitmap information... */
header.bfType      = read_word(fp);
header.bfSize      = read_dword(fp);
header.bfReserved1 = read_word(fp);
header.bfReserved2 = read_word(fp);
header.bfOffBits   = read_dword(fp);

if (header.bfType != BF_TYPE) /* Check for BM reversed... */
    {
    /* Not a bitmap file - return NULL... */
    fclose(fp);
    return (NULL);
    }

infosize = header.bfOffBits - 18;
if ((*info = (BITMAPINFO *)malloc(sizeof(BITMAPINFO))) == NULL)
    {
    /* Couldn t allocate memory for bitmap info - return NULL... */
    fclose(fp);
    return (NULL);
    }

(*info)->bmiHeader.biSize          = read_dword(fp);
(*info)->bmiHeader.biWidth         = read_long(fp);
(*info)->bmiHeader.biHeight        = read_long(fp);
(*info)->bmiHeader.biPlanes        = read_word(fp);
(*info)->bmiHeader.biBitCount      = read_word(fp);
(*info)->bmiHeader.biCompression   = read_dword(fp);
(*info)->bmiHeader.biSizeImage     = read_dword(fp);
(*info)->bmiHeader.biXPelsPerMeter = read_long(fp);
(*info)->bmiHeader.biYPelsPerMeter = read_long(fp);
(*info)->bmiHeader.biClrUsed       = read_dword(fp);
(*info)->bmiHeader.biClrImportant  = read_dword(fp);

if (infosize > 40)
if (fread((*info)->bmiColors, infosize - 40, 1, fp) < 1)
        {
        /* Couldn t read the bitmap header - return NULL... */
        free(*info);
        fclose(fp);
        return (NULL);
        }

/* Now that we have all the header info read in, allocate memory for *
 * the bitmap and read *it* in...                                    */
if ((bitsize = (*info)->bmiHeader.biSizeImage) == 0)
    bitsize = ((*info)->bmiHeader.biWidth *
               (*info)->bmiHeader.biBitCount+7) / 8 *
           abs((*info)->bmiHeader.biHeight);

if ((bits = malloc(bitsize)) == NULL)
    {
    /* Couldn t allocate memory - return NULL! */
    free(*info);
    fclose(fp);
    return (NULL);
    }

if (fread(bits, 1, bitsize, fp) < bitsize)
    {
    /* Couldn t read bitmap - free memory and return NULL! */
    free(*info);
    free(bits);
    fclose(fp);
    return (NULL);
    }

//This needs to be done when the height is negative
if ((*info)->bmiHeader.biHeight < 0) {
    (*info)->bmiHeader.biHeight *= -1;

    int bitsPerPixel = (*info)->bmiHeader.biBitCount;
    int bytesPerPixel;
    if (bitsPerPixel >= 8) {
        bytesPerPixel = bitsPerPixel/8;
    } else {
        exit(1);
    }       

    int i;  //Row
    int j;  //Column
    for (i = 0; i < floor((*info)->bmiHeader.biHeight/2); i++) {
        int inlineRowValue = i * (*info)->bmiHeader.biWidth * bytesPerPixel;
        int inlineInvRowValue = ((*info)->bmiHeader.biHeight - i) * (*info)->bmiHeader.biWidth * bytesPerPixel;

        for (j = 0; j < (*info)->bmiHeader.biWidth; j++) {
            int inlineColumnValue = j * bytesPerPixel;
            int currentPos = inlineRowValue + inlineColumnValue;
            int invCurrentPos = inlineInvRowValue + inlineColumnValue;

            int k;
            GLubyte *temp = malloc(sizeof(GLubyte)*bytesPerPixel);
            for (k = 0; k < bytesPerPixel; k++) {
                temp[k] = bits[currentPos+k];                   
            }
            for (k = 0; k < bytesPerPixel; k++) {
                bits[currentPos+k] = bits[invCurrentPos+k];
                bits[invCurrentPos+k] = temp[k];    
            }               

            free(temp);
        }
    }
}

/* OK, everything went fine - return the allocated bitmap... */
fclose(fp);
return (bits);
}

我的直观告诉我,档案点名器的 is子在从BMP档案中读到的东西时被适当加固。

如果贵格会有任何想法,请予以分享。 我非常感激。 这对我来说是一种nut子。

最佳回答

我认为,你在此背弃错误数额:

infosize = header.bfOffBits - 18;

这似乎说明头盔信息的规模,但头盔为14字(3个字和2个字),而不是18个字节。

不是依靠阅读,而是完全依靠头脑和胎儿结构的适当数量,为什么不能直接使用:

fseek(fp, header.bfOffBits, SEEK_SET);

在阅读图像数据之前?

问题回答

暂无回答




相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签