Что мне нужно сделать, это отобразить изображение с помощью файла .ptm.
Итак, я открываю файл, читаю W и H и устанавливаю RGBA для каждого пикселя. Но когда я пытаюсь отобразить, я получаю ошибку Access Violation в glutSwapBuffers()
,
Вот код Это что-то вроде беспорядка, потому что я пытаюсь исправить это разными способами, но я начинаю думать, что каждый раз я создаю новую проблему: D
Image.h
class Image {
public:
Image() {};
Image(int w, int h);
~Image();
void setPixel(int rgb, int x, int y) {
pixels[x + y] = rgb;
}
int setRgb(int r, int g, int b);
int setRgb(int r, int g, int b, int a);
int getPixel(int x, int y) {
return pixels[x + y*width];
}
int * getPixel() { return pixels; }
int getWidth() { return width; }
int getHeight() { return height; }
private:
int *pixels;
int width, height;
};
Image.cpp
#include "Image.h"#include <stdlib.h>Image::Image(int w, int h)
{
width = w; height = h;
pixels = (int*)malloc(h*w);
}Image::~Image()
{
}
int Image::setRgb(int r, int g, int b)
{
int rgb;
rgb = (r << 16) | (g << 8) | b;
return rgb;
}
int Image::setRgb(int r, int g, int b, int a)
{
int rgba;
rgba = (a<< 24) | (r << 16) | (g << 8) | b;
return rgba;
}
source.cpp
#include <GL\freeglut.h>
#include <GL\GL.h>
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
#include "Image.h"
using namespace std;
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
Image *img = new Image(800, 500);
int w, h, max; //width height MaxValue
char *w_ = new char; //in case of the file doesn't have a comment
string fileModel, comment;
ifstream myfile("dba.ptm"); //open the file
if (myfile.is_open())
{
myfile >> fileModel;
if (fileModel == "P7")
{
myfile >> w_;
if (*w_ == '#')
getline(myfile, comment);
else
w = atoi(w_);
myfile >> h;
int a, r, g, b, rgba;
myfile >> max;
for (int i = 0; i < w; i++)
{
for (int k = 0; k < h; k++)
{
myfile >> a;
myfile >> r;
myfile >> g;
myfile >> b;
rgba = img->setRgb(r, g, b, a);
img->setPixel(rgba, i, k);
}
}
}
}
myfile.close();glDrawPixels(img->getWidth(), img->getHeight(), GL_BGRA_EXT, GL_UNSIGNED_BYTE, img->getPixel());
glutSwapBuffers();
}
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 800.0, 0.0, 500.0, -1.0, 1.0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(800, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("PTM");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Извините, но у вас много неправильного … 🙂
new[]
free
или же delete
что-нибудьpixels
) вам все равно не нужно создавать вещи в кучеpixels[x + y] = rgb;
очевидно неправильноchar *w_ = new char; //in case of the file doesn't have a comment
myfile >> w_;
if (*w_ == '#')
Там, вероятно, больше. 🙁
malloc(h*w)
должно быть malloc(h*w*sizeof(int))
иначе вы только выделяете достаточно памяти для четверти вашего изображения.
Вы также, кажется, пропускаете все изображение в каждом отдельном кадре, что быстро исчерпает вашу доступную оперативную память. Вам нужно free
а также delete
все, что вы malloc
а также new
соответственно.
Возможно, вы также захотите сразу же очистить память, выделенную для изображения, чтобы избежать проблем, когда установлены только некоторые пиксели (остальные будут случайными значениями, что, вероятно, менее предпочтительно, чем, например, полная прозрачность). Вы можете сделать это с memset
или же std::fill
после malloc
,