我现在就为我的视觉信息处理课程制定一个方案。 我们重新给出了所有家庭工程的骨干模板,因为这个班子的重心是学习中产阶级。 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子。