调用glReadPixels函数 得到的全为黑色 80C

我实在winform窗口中 调用了一个mfc做的dll中的函数进行opengl绘制。然后想得到窗口中每个像素的颜色来进行截屏生成图片,但是用glReadPixels函数读到的都是黑色。
初始化是用winform的handle带进去进行初始化,然后绘制一个全部绿色的窗口。绿色窗口成功显示,但是但是用glReadPixels函数读不出来。
初始化过程:图片说明图片说明
然后绘制的函数:图片说明
读取像素的函数:图片说明
图像绘制是成功的:图片说明
但是读取到的值都是黑色,只有alpha是ff:图片说明
why???

1个回答

你的GetScreenSnot在哪里调用的?
glReadPixels实际上是从缓冲区中读取数据,如果使用了双缓冲区,则默认是从正在显示的缓冲(即前缓冲)中读取,而绘制工作是默认绘制到后缓冲区的。一句话,glReadPixels需要在swapbuffers以后调用才行,另外,也不推荐用这个函数,效率超级差

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
glReadPixels读出来全是黑色
不管中间SwapBuffers有没有,都出来的颜色都是黑色![图片说明](https://img-ask.csdn.net/upload/201802/08/1518079714_758165.png)
coin3D渲染后读取像素深度
利用coin3D的SoOffScreenRender节点渲染了场景,再利用glReadPixels函数读取深度值,结果调试发现并没有深度值被读取,同样的做法在OpenInventor中却能读出,想问这个原因是什么? 怎么解决?
Android opengl es20 glReadPixels获取原视频分辨率大小帧数据
Android上用opengl es20在小屏幕上渲染1080P视频,怎么通过glReadPixels获取原分辨率大小的帧数据?现在通过glReadPixels只能获取到渲染后屏幕大小的分辨率,需要 获取原视频的帧数据
ios8中无法使用glReadPixels方法
在做一个视频截屏功能,用到OpenGL的glReadPixels方法,在ios7.1中都没有问题,但是在ios8中提示:Implicit declaration of function 'glReadPixels' is invalid in C99 和 use of undeclared identifier 'GL_RGBA'
我在opengl中使用FreeImage 来保存绘制后的图形,但保存后却是一张黑色图片,求解
#include <math.h> #define GLUT_DISABLE_ATEXIT_HACK #define MAX_CHAR 128 #include <glut.h> #include <stdio.h> #include <string.h> #include <sstream> #include <windows.h> #include "FreeImage.h" #if def_DEBUG #pragma comment(lib, "FreeImaged.lib") #else #pragma comment(lib, "FreeImage.lib") #endif #pragma comment(lib,"glut32.lib") using namespace std; string num2string(float i) { stringstream ss; ss << i; return ss.str(); } void drawString(string strn) { static int isFirstCall = 1; static GLuint lists; const char *str = strn.c_str(); if (isFirstCall) { // 如果是第一次调用,执行初始化 // 为每一个ASCII字符产生一个显示列表 isFirstCall = 0; // 申请MAX_CHAR个连续的显示列表编号 lists = glGenLists(MAX_CHAR); // 把每个字符的绘制命令都装到对应的显示列表中 wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists); } // 调用每个字符对应的显示列表,绘制每个字符 for (; *str != '\0'; ++str) glCallList(lists + *str); } void grab() { int WIDTH=800, HEIGHT=500; unsigned char*mpixels = new unsigned char[WIDTH*HEIGHT*3]; glReadBuffer(GL_FRONT); glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, mpixels); glReadBuffer(GL_BACK); for (int i=0; i<(int)WIDTH*HEIGHT*3; i+=3) { mpixels[i]^= mpixels[i+2]^= mpixels[i]^= mpixels[i+2]; } FIBITMAP *bitmap= FreeImage_Allocate(WIDTH, HEIGHT, 24, 8, 8, 8); for (unsigned int y=0; y<FreeImage_GetHeight(bitmap); y++) { BYTE *bits=FreeImage_GetScanLine(bitmap,y); for (unsigned int x=0; x<FreeImage_GetWidth(bitmap); x++) { bits[0]=mpixels[(y*WIDTH+x)*3+0]; bits[1]=mpixels[(y*WIDTH+x)*3+1]; bits[2]=mpixels[(y*WIDTH+x)*3+2]; bits += 3; } } FreeImage_Save(FIF_JPEG, bitmap, "test.jpg", JPEG_DEFAULT); FreeImage_Unload(bitmap); } void createCoordinate(GLfloat x0, GLfloat y0) { int i = 0, k = 12,j = 9; GLfloat x[100], y[10]; for (i = 0; i < k; i++) { x[i] = x0 + 0.1*(i + 1); } for (i = 0; i < j; i++) { y[i] = y0 + 0.1*(i + 1); } //设置颜色 glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f); GLfloat lineWidth = 0.5f; glLineWidth(lineWidth); glBegin(GL_LINES); glVertex2f(0.0f, -0.5f); //纵轴 glVertex2f(0.0f, 0.5f); glVertex2f(0.02f, 0.48f); glVertex2f(0.0f, 0.5f); glVertex2f(-0.02f, 0.48f); glVertex2f(0.0f, 0.5f); glVertex2f(-0.1f, 0.0f); //横轴 glVertex2f(1.05f, 0.0f); glVertex2f(1.03f, 0.02f); glVertex2f(1.05f, 0.0f); glVertex2f(1.03f, -0.02f); glVertex2f(1.05f, 0.0f); glEnd(); lineWidth = 0.1f; glLineWidth(lineWidth); glBegin(GL_LINES); for (i = 0; i < k; i++) { glVertex2f(x[i], 0.02); glVertex2f(x[i], 0); } for (i = 0; i < j; i++) { glVertex2f(0.02, y[i]); glVertex2f(0, y[i]); } glEnd(); string s; for (i = 0; i < k; i++) { s = num2string(0.1 * (i + 1)-0.2); glRasterPos2f(x[i], -0.05f); drawString(s); } for (i = 0; i < j; i++) { s = num2string(0.1 * (i + 1) - 0.5); glRasterPos2f(-0.05f, y[i]); drawString(s); } } void data() { float data; GLfloat a[50000], b[1440][2]; int i=0 , k = 0; FILE *fp = fopen("E:\\ice.txt", "r"); if (!fp) { printf("can't open file\n"); } while (!feof(fp)) { fscanf(fp, "%f", &data); a[i] = data; i++; } k = i /2; printf("\n"); fclose(fp); int j, t = 0; for (i = 0; i<k; i++) for (j = 0; j<2; j++) { b[i][j] = a[t++]; } for (i = 0; i < k; i++) { printf("%f %f \n", b[i][0], b[i][1]); } GLfloat pointSize = 5.0f; glPointSize(pointSize); glBegin(GL_LINE_STRIP); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 0.0f, 0.0f); for (i = 0; i<k; i++) { glVertex2f(b[i][0], b[i][1]); } glEnd(); } void Display() { //GLfloat x0 = 10.0f, y0 = 10.0f; GLfloat x0 = -0.2f, y0 = -0.5f; createCoordinate(x0, y0); data(); //glFlush(); glutSwapBuffers(); } void Initial() { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //清屏颜色 glMatrixMode(GL_PROJECTION); gluOrtho2D(-0.2, 1.1, -0.5, 0.5); //投影到裁剪窗大小:世界 } //void timerProc(int id) //{ // Display(); //glutTimerFunc(33, timerProc, 1);//需要在函数中再调用一次,才能保证循环?? //} int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); //glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(800, 500); glutInitWindowPosition(300, 300); glutCreateWindow("Scatter Plot"); glutDisplayFunc(Display); grab(); Initial(); glutMainLoop(); //glutTimerFunc(330, timerProc, 1); return 0; }
opengl屏幕坐标转世界坐标的问题
我正在试图用opengl实现一个类似google earth那样的功能: 1),相机永远面向地球的球心 2),鼠标定点拖动旋转,也就是鼠标按住地球上一个点移动的时候,这个点就跟随鼠标的位置运动,鼠标动了多长,相机就旋转多长,一开始按住的那个点一直处于鼠标的位置,而不要跑开了 现在我已经实现了基本的旋转部分,拖动鼠标相机就转动,但没有定点转动,现在就剩下定点拖动旋转这个功能了,我的思路是将鼠标点击屏幕的屏幕坐标转换成opengl的世界坐标,通过这个点构造一个射线,求出射线和地球的交点坐标,如果射线和地球没有相交,则不会产生任何效果。如果有相交,则计算鼠标移动到下一个位置的时候的屏幕射线与地球的交点坐标,通过两个坐标的值近似计算成鼠标在地球表面划过的弧长,然后将这个长度作为偏移量算出相机旋转的量。 现在的问题是屏幕坐标转世界坐标异常,不管点击屏幕上的任何一点,计算出的世界坐标都几乎一样,只有小数点后好几位的值有细微差别,旋转相机或者远离或靠近地球时坐标值会改变,但依然屏幕任何一点的坐标都差不多一样,计算坐标转换的代码如下: void screen2world(int x, int y) { GLint viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; GLfloat winX, winY, winZ; GLdouble posX, posY, posZ; glGetDoublev(GL_MODELVIEW_MATRIX, modelview); glGetDoublev(GL_PROJECTION_MATRIX, projection); glGetIntegerv(GL_VIEWPORT, viewport); winX = (float)x; winY = (float)viewport[3] - (float)y; glReadPixels(x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ); gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); } 请问一下出现问题的原因可能是什么?另外我的鼠标定点拖动旋转的思路有问题吗?还有就是有没有实现类似google earth那样的拖动旋转功能的demo源码可供查考,谢谢
coin3D 中的depth 数据的提取
用coin3D显示了一个场景图,想把这个场景图对应的深度数据提取出来,想到用glReadpixels读取,但是没有任何数据,同样的方法在Open Inventor却可以,所以请教各位高手,有没有做过这个方面的?
coin3d 读取场景深度数据
用coin3D 的SoOffScreenRenderer类的对象渲染场景后,再用opengl函数glReadPixels来读取深度数据,但是根本没有作用,但是同样的代码在open Inventor里是可以的,就想问有没有人碰到过类似的问题,下面就是一个例子的代码: int _tmain(int , char **argv) { HWND window = SoWin::init(argv[0]); if (window==NULL) exit(1); int width=640; int height=480; SoWinExaminerViewer * viewer = new SoWinExaminerViewer(window); SbVec2s size; size.setValue(640,480); viewer->setSize(size); SoOffscreenRenderer *m_Render=new SoOffscreenRenderer(viewer->getViewportRegion()); m_Render->setBackgroundColor(SbColor(0.0f,0.0f,0.0f)); SoSeparator * root = new SoSeparator; SoCone * cone = new SoCone; root->ref(); root->addChild(cone); m_Render->render(root); IplImage *m_Depth=NULL; m_Depth=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,1); float* _Depth=(float*)m_Depth->imageData; glReadPixels(0,0,640,480,GL_DEPTH_COMPONENT,GL_FLOAT,_Depth); IplImage *m_RenderDepthReal= cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1); char* _DepthImg= m_RenderDepthReal->imageData; for (int i= 0; i< height; i++) { _DepthImg= m_RenderDepthReal->imageData+ (height-i-1)* width;//从图像左上角开始遍历图像 for (int j= 0; j< width; j++) { float _Cur= _Depth[i*width+j]; _DepthImg[j]= (char)((_Cur)* 255); } } viewer->setSceneGraph(root); viewer->show(); //myCamera->viewAll(root,m_Manager->getViewportRegion(),2.0); SoWin::show(window); SoWin::mainLoop(); delete viewer; root->unref(); return 0; }
请教渲染到缓冲区为什么结果都是1呢
我尝试创建一个1024*728大小的浮点纹理,初始值为0。通过Initialize函数初始化环境; 通过Timer定时执行Tick。Tick函数实现绑定到缓冲区并绘制。 Initialize函数为: STDMETHODIMP CRunoffModel::Initialize(IGpuModelViewer*pViewer) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if(frontTexture!=0) glDeleteTextures(1,&frontTexture); if(backTexture!=0) glDeleteTextures(1,&backTexture); if(FramebufferName!=0) glDeleteFramebuffers(1,&FramebufferName); if(DepthBufferName!=0) glDeleteRenderbuffers(1,&DepthBufferName); frontTexture=0; backTexture=0; FramebufferName=0; glGenTextures(1,&frontTexture); glGenTextures(1,&backTexture); glGenFramebuffers(1, &FramebufferName); glGenRenderbuffers(1, &DepthBufferName); glBindTexture(GL_TEXTURE_2D, frontTexture); float*textData=(float*)psa->pvData; glTexImage2D(GL_TEXTURE_2D,0,GL_R32F,cols, rows,0,GL_RED,GL_FLOAT,textData); glBindTexture(GL_TEXTURE_2D, backTexture); glTexImage2D(GL_TEXTURE_2D,0,GL_R32F,cols, rows,0,GL_RED,GL_FLOAT,textData); glBindTexture(GL_TEXTURE_2D, backTexture); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); glBindTexture(GL_TEXTURE_2D, frontTexture); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); pShader.CompileShader(IDR_PASS_VP,IDR_PASS_FP, 2, GLT_ATTRIBUTE_VERTEX, "vVertex",GLT_ATTRIBUTE_TEXTURE0,"vTexCoords"); CString uniforms[2]={"mvpMatrix","m_texture"}; pShader.FindUniforms(uniforms,2); return S_OK; } Tick函数为: STDMETHODIMP CRunoffModel::Tick(IGpuModelViewer*pViewer) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FramebufferName); glBindRenderbuffer(GL_RENDERBUFFER, DepthBufferName); glBindFramebuffer(GL_DRAW_FRAMEBUFFER,FramebufferName); glBindRenderbuffer(GL_RENDERBUFFER, DepthBufferName); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32, cols, rows); glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,frontTexture,0); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,DepthBufferName); M3DMatrix44f proj; m3dMakeOrthographicMatrix(proj,0,cols,0,rows,-1,0); M3DMatrix44f matProj; m3dLoadIdentity44(matProj); M3DMatrix44f matViewProj; m3dMatrixMultiply44(matViewProj,proj,matProj); //GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0_EXT}; //glDrawBuffers(1,DrawBuffers); glDrawBuffer(GL_COLOR_ATTACHMENT0); glPolygonMode(GL_FRONT,GL_FILL); if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBindRenderbuffer(GL_RENDERBUFFER, 0); //设置为0后,就退出纹理渲染状态 return S_OK; } glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,backTexture); //纹理绘制过程 glUseProgram(pShader.GetShaderID()); glUniform1i(pShader.GetUniformLocation("m_texture"), 0); glUniformMatrix4fv(pShader.GetUniformLocation("mvpMatrix"), 1, GL_FALSE,matProj); glBegin(GL_QUADS); glVertex3f(0.0,0.0,0.0); glTexCoord2f(0.0,0.0); glVertex3f(cols, 0.0,0.0); glTexCoord2f(1.0,0.0); glVertex3f(cols,rows,0.0) ; glTexCoord2f(1.0,1.0); glVertex3f(0.0,rows,0.0) ; glTexCoord2f(0.0,1.0); glEnd(); glFinish(); if(tickCount%1==0) { float*textData=(float*)psa->pvData; glReadBuffer(GL_COLOR_ATTACHMENT0); glReadPixels(0,0,cols,rows,GL_RED,GL_FLOAT,textData); //读取数据 } //交换纹理 GLuint tempText=frontTexture; frontTexture=backTexture; backTexture=tempText; glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBindRenderbuffer(GL_RENDERBUFFER, 0); tickCount++; return S_OK; } 无论我怎样设置片段着色器,Tick函数glReadPixels结果始终为1。请求大神帮助
关于opengl帧缓存对象FBO深度缓存的问题
各位老师好,在下opengl菜鸟一枚,最近学习opengl和glsl的过程中,使用FBO的深度缓存做延时渲染的时候遇到了一些问题。 我想实现个shadowmap,在光源视角下将深度缓存渲染进fbo,但是渲染第一次结束后,附加到fbo中的深度纹理里面的值却全部都为0。后来为了测试问题,我删除掉了第二个shader,只保留了第一个用来产生shadowmap的shader,发现fbo深度缓存依然都是0。如能指教迷津,不胜感激。一下是我的代码: main函数 ``` #include <stdio.h> #include "Declaration.h" #include "LoadShaders.h" #include <gl/glew.h> #include <gl/freeglut.h> #include "cv.h" #include "highgui.h" #include "cxcore.h" #include "StructDef.h" GLuint *FBOUsedVAOs; GLuint *FBOUsedBuffers; GLuint *programs; GLuint *FBOs; GLuint *DepthTextureIDs; void init() { DepthTextureIDs = (GLuint*)malloc(sizeof(GLuint));//申请深度纹理对象ID的内存 glGenTextures(1, DepthTextureIDs);//产生深度纹理ID glBindTexture(GL_TEXTURE_2D, DepthTextureIDs[0]);//绑定深度纹理ID //设置纹理参数 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 512, 512, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glBindTexture(GL_TEXTURE_2D, 0);//解绑纹理ID FBOs = (GLuint*)malloc(sizeof(GLuint));//申请帧缓存对象的内存 glGenFramebuffers(1,FBOs);//产生帧缓存对象 glBindFramebuffer(GL_FRAMEBUFFER, FBOs[0]);//绑定帧缓存对象 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, DepthTextureIDs[0], 0); glDrawBuffer(GL_NONE); glReadBuffer(GL_NONE); glBindFramebuffer(GL_FRAMEBUFFER, 0);//解绑帧缓存对象 programs = (GLuint*)malloc(sizeof(GLuint));//申请着色程序内存 ShaderInfo FBOShader[3] = { //用于渲染shadowmap的着色器 { GL_VERTEX_SHADER, "FBOShader.vert" }, { GL_FRAGMENT_SHADER, "FBOShader.frag" }, { GL_NONE, NULL } }; programs[0] = LoadShaders(FBOShader); //加载着色器 //计算各种坐标转换矩阵 float ModelMat[16]; float ViewMat[16]; float PerspectiveProjectMat[16]; float MAngle321[3] = {0, 0, 0.0}; float MOffset[3] = {0.0, 0.0, 0.0}; float VAngle321[3] = {0, 1.57, 0.0}; float VOffset[3] = {0, 0, 5.0}; float FOV = 1.57; float Aspect = 1; float NearDist = 1.0; float FarDist = 6; ModelMatCal(ModelMat, MAngle321, MOffset); ViewMatCal(ViewMat, VAngle321, VOffset); PerspectiveProjectMatCal(PerspectiveProjectMat, FOV, Aspect, NearDist, FarDist); float MVMat[16]; float MVPMat[16]; MatMultiplyMat4(MVMat, ViewMat, ModelMat); MatMultiplyMat4(MVPMat, PerspectiveProjectMat, MVMat); //将矩阵传递进FBOShader glUseProgram(programs[0]);//必须放在向shader中传Uniform数据的前面 GLint MVPMatLoc; MVPMatLoc = glGetUniformLocation(programs[0],"MVPMat"); glUniformMatrix4fv(MVPMatLoc, 1, GL_FALSE, MVPMat); //设置顶点数组 #define BUFFER_OFFSET(offset) ((void *)(NULL+offset)) FBOUsedVAOs = (GLuint*)malloc(sizeof(GLuint)); FBOUsedBuffers = (GLuint*)malloc(sizeof(GLuint)); glGenVertexArrays(1, FBOUsedVAOs); glGenBuffers(1, FBOUsedBuffers); float FBOUsedVertices[24]= { 1.0f, 1.0f, 3.0f, 1.0f, -1.0f, 1.0f, 3.0f, 1.0f, -1.0f, -1.0f, 3.0f, 1.0f, 1.0f, 1.0f, 3.0f, 1.0f, -1.0f, -1.0f, 3.0f, 1.0f, 1.0f, -1.0f, 3.0f, 1.0f }; glBindVertexArray(FBOUsedVAOs[0]); glBindBuffer(GL_ARRAY_BUFFER, FBOUsedBuffers[0]); glBufferData(GL_ARRAY_BUFFER, sizeof(FBOUsedVertices), FBOUsedVertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glEnableVertexAttribArray(0); } void display() { //向帧缓存对象中渲染数据 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindFramebuffer(GL_FRAMEBUFFER, FBOs[0]);//绑定帧缓存对象 glUseProgram(programs[0]);//选定shader glBindVertexArray(FBOUsedVAOs[0]); glDrawArrays(GL_TRIANGLES, 0, 6); float *DepthPixel = (float *)malloc(sizeof(float)); glReadPixels(256,256,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,DepthPixel); glBindFramebuffer(GL_FRAMEBUFFER, 0); glFlush(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(512, 512); glutInitContextVersion(4, 3); glutInitContextProfile(GLUT_CORE_PROFILE); glutCreateWindow(argv[0]); glewExperimental = GL_TRUE; if (glewInit()) { cerr << "Unable to initialize GLEW ... exiting" << endl; exit(1); } glEnable(GL_TEXTURE_CUBE_MAP); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); init(); glutDisplayFunc(display); glutMainLoop(); } ``` 顶点着色器 ``` #version 430 layout(location = 0)in vec4 VertPosition; uniform mat4 MVPMat; void main() { gl_Position = MVPMat * VertPosition; } ``` 片元着色器 ``` #version 430 out vec4 FragColor; void main() { FragColor = vec4(vec3(gl_FragCoord.z), 1.0f); } ``` 将display函数中的glBindFramebuffer(GL_FRAMEBUFFER, FBOs[0])注释掉,就能够在DepthPixel中看到正确的深度结果,但是只要绑定了fbo,其深度结果就全都是0.也就是说,在屏渲染的时候,我能够获取到正确的深度值,但是离屏渲染的时候,深度值总是0.
openGL读取和写入,生成的图片是空的。
我从网上找的openGL教程 教到第十课关于读图片与写,可是不管用生成的图片是空的。 #define WindowWidth 400 #define WindowHeight 400 #include<stdio.h> #include<stdlib.h> #include<gl/glut.h> #define BMP_HEADER_LENGtH 54 void grab(void) { FILE* pDummyFile; FILE* pWritingFile; GLubyte* pPixelData; GLubyte* BMP_HEAD[BMP_HEADER_LENGtH]; GLint i,j; GLint PixelDataLength; i=WindowWidth*3; while(i%4!=0) ++i; PixelDataLength=i*WindowHeight; pPixelData=(GLubyte*)malloc(PixelDataLength); if(pPixelData=0) exit(0); fopen_s(&pDummyFile,"dummy.bmp", "rb"); if(pDummyFile=0) exit(0); fopen_s(&pWritingFile,"grab.bmp", "wb"); if(pWritingFile=0) exit(0); glPixelStorei(GL_UNPACK_ALIGNMENT,4); glReadPixels(0,0,WindowWidth,WindowHeight,GL_BGR_EXT,GL_UNSIGNED_BYTE,pPixelData); fread(BMP_HEAD,sizeof(BMP_HEAD),1,pDummyFile); fwrite(BMP_HEAD,sizeof(BMP_HEAD),1,pWritingFile); fseek(pWritingFile,0x0012,SEEK_SET); i=WindowWidth; j=WindowHeight; fwrite(&i,sizeof(i),1,pWritingFile); //fseek(pWritingFile,0x0016,SEEK_SET); fwrite(&j,sizeof(j),1,pWritingFile); fseek(pWritingFile,0,SEEK_END); fwrite(pPixelData,PixelDataLength,1,pWritingFile); fclose(pDummyFile); fclose(pWritingFile); free(pPixelData); } void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glRectf(-0.5f,-0.5f,0.5f,0.5f); glFlush(); grab(); } int main(int argc, char *argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE); glutInitWindowPosition(100,100); glutInitWindowSize(400,400); glutCreateWindow("第一个OpenGL程序"); glutDisplayFunc(&myDisplay); glutMainLoop(); return 0; }
关于华为系列手机用代码截屏图片全黑的解决方案
吧opengl的渲染保存在一个 Bitmap 下 ``` int b[]=new int[w*h]; int bt[]=new int[w*h]; IntBuffer ib=IntBuffer.wrap(b); ib.position(0); gl.glReadPixels(x, y, w, h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib); for(int i=0; i<h; i++) { for(int j=0; j<w; j++) { int pix=b[i*w+j]; int pb=(pix>>16)&0xff; int pr=(pix<<16)&0x00ff0000; int pix1=(pix&0xff00ff00) | pr | pb; bt[(h-i-1)*w+j]=pix1; } } Bitmap sb=Bitmap.createBitmap(bt, w, h, Config.ARGB_8888); ``` 然后使用 ``` String uriStr = MediaStore.Images.Media.insertImage(context.getContentResolver(), bm, "", ""); if(uriStr == null){ return false; } String picPath = getFilePathByContentResolver(this, Uri.parse(uriStr) ); if(picPath == null) { return false; } ContentResolver contentResolver = context.getContentResolver(); ContentValues values = new ContentValues(4); values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis()); values.put(Images.Media.MIME_TYPE, "image/png"); values.put(Images.Media.ORIENTATION, 0); values.put(Images.Media.DATA, picPath); contentResolver.insert(Images.Media.EXTERNAL_CONTENT_URI, values); ``` 结果发现保存的图片都是全黑的jpg(应该是png但是保存的是jpg),我用这个方法在其他品牌的手机上都能正常使用,请问华为系列贴别是荣耀系列有什么特殊方案来解决全黑么
反应扩散Gray-Scott模型问题(OpenGL纹理)
![图片说明](https://img-ask.csdn.net/upload/201703/31/1490936767_681612.png) **谁能告诉我什么问题?以上是运行结果,一下是代码。** #include "GrayScott.h" #include "math.h" laplace GS_Grid[WIDTH][HEIGHT] = {}; GLubyte GS_Pix[WIDTH][HEIGHT][4]; //纹理数据 GLubyte GS_test[WIDTH][HEIGHT][4]; float GS_LAPLACIAN[3][3] = { { 0.05,0.2,0.05 }, { 0.2, -1, 0.2 }, { 0.05,0.2,0.05 } }; //初始化 void GS_Initialize() { glClearColor(0.0, 0.0, 0.0, 0.0); for (int i = 0; i < WIDTH; i++) { for (int j = 0; j < HEIGHT; j++) { GS_Grid[i][j].a = 1;//rand()/100000.0; GS_Grid[i][j].b = 0.5;// rand() / 100000.0; GS_test[i][j][0] = (GLubyte)100; GS_test[i][j][1] = (GLubyte)100; GS_test[i][j][2] = (GLubyte)100; GS_test[i][j][3] = (GLubyte)255; } } for (int i = 1; i < 30; i++) { for (int j = 1; j < 30; j++) { //GS_Grid[i][j].b = 1.0; } } GS_PixelUpdate(); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); //设置纹理参数 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WIDTH, HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GS_test); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); //设置纹理环境 glEnable(GL_TEXTURE_2D); } //交换 void GS_Swap() { } //更新 void GS_PixelUpdate() { int i, j, c; GS_ReactionDiffusion(); //glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGR_EXT, GL_UNSIGNED_BYTE, &pix); for (i = 0; i < HEIGHT; i++) { for (j = 0; j < WIDTH; j++) { //c = ((((i & 0x8) == 0) ^ ((j & 0x8)) == 0)) * 255;//黑白方块交替 //int c = max(min(texNext[i][j].a - texNext[i][j].b, 1), 0); c = floor((GS_Grid[i][j].a - GS_Grid[i][j].b) * 255); GS_Pix[i][j][0] = (GLubyte)c; GS_Pix[i][j][1] = (GLubyte)GS_Grid[i][j].a*255;// floor(GS_Grid[i][j].a * 255); GS_Pix[i][j][2] = (GLubyte)GS_Grid[i][j].b * 255;// floor(GS_Grid[i][j].b * 255); GS_Pix[i][j][3] = (GLubyte)255; } } } //反应扩散 void GS_ReactionDiffusion() { //反应扩散 for (int x = 0; x < WIDTH; x++) { for (int y = 0; y < HEIGHT; y++) { float a = GS_Grid[x][y].a; float b = GS_Grid[x][y].b; //更新 GS_Grid[x][y].a = a + ((GS_DA*GS_Laplacian(x, y, GS_U)) - (a*b*b) + (GS_FEED*(1 - a)))*GS_DT; GS_Grid[x][y].b = b + ((GS_DB*GS_Laplacian(x, y, GS_V)) + (a*b*b) - ((GS_KILL + GS_FEED)*b))*GS_DT; } } } //显示纹理 void GS_Display() { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WIDTH, HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GS_test); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glPushMatrix(); glColor4f(0, 0, 1, 1); glTranslatef(0.0, 0.0, -7.0); //glRotatef(xRot, 1, 0, 0); glBegin(GL_QUADS); //指定纹理坐标 glTexCoord2f(0.0, 0.0); glVertex3f(-3.0, -3.0, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(-3.0, 3.0, 0.0); glTexCoord2f(1.0, 1.0); glVertex3f(3.0, 3.0, 0.0); glTexCoord2f(1.0, 0.0); glVertex3f(3.0, -3.0, 0.0); glEnd(); glPopMatrix(); glFlush(); } //拉普拉斯算子 float GS_Laplacian(int x, int y, int target) { GLfloat sum = 0.0; if (target == GS_U) { sum += GS_LAPLACIAN[1][1] * GS_Grid[x][y].a; sum += GS_LAPLACIAN[1][1 - 1] * GS_Grid[x][y - 1].a; sum += GS_LAPLACIAN[1][1 + 1] * GS_Grid[x][y + 1].a; sum += GS_LAPLACIAN[1 - 1][1] * GS_Grid[x - 1][y].a; sum += GS_LAPLACIAN[1 + 1][1] * GS_Grid[x + 1][y].a; sum += GS_LAPLACIAN[1 - 1][1 - 1] * GS_Grid[x - 1][y - 1].a; sum += GS_LAPLACIAN[1 + 1][1 - 1] * GS_Grid[x + 1][y - 1].a; sum += GS_LAPLACIAN[1 + 1][1 + 1] * GS_Grid[x + 1][y + 1].a; sum += GS_LAPLACIAN[1 - 1][1 + 1] * GS_Grid[x - 1][y + 1].a; } else if (GS_V == target) { sum += GS_LAPLACIAN[1][1] * GS_Grid[x][y].b; sum += GS_LAPLACIAN[1][1 - 1] * GS_Grid[x][y - 1].b; sum += GS_LAPLACIAN[1][1 + 1] * GS_Grid[x][y + 1].b; sum += GS_LAPLACIAN[1 - 1][1] * GS_Grid[x - 1][y].b; sum += GS_LAPLACIAN[1 + 1][1] * GS_Grid[x + 1][y].b; sum += GS_LAPLACIAN[1 - 1][1 - 1] * GS_Grid[x - 1][y - 1].b; sum += GS_LAPLACIAN[1 + 1][1 - 1] * GS_Grid[x + 1][y - 1].b; sum += GS_LAPLACIAN[1 + 1][1 + 1] * GS_Grid[x + 1][y + 1].b; sum += GS_LAPLACIAN[1 - 1][1 + 1] * GS_Grid[x - 1][y + 1].b; } return sum; } void GS_Reshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 30.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } //计时器 void GS_OnTimer(int value) { GS_PixelUpdate(); glutPostRedisplay(); glutTimerFunc(500, GS_OnTimer, 1); } void main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); GS_Initialize(); glutDisplayFunc(GS_Display); glutReshapeFunc(GS_Reshape); glutTimerFunc(100, GS_OnTimer, 1); glutMainLoop(); } ``` ```
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
MyBatis研习录(01)——MyBatis概述与入门
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis原本是apache的一个开源项目iBatis, 2010年该项目由apache software foundation 迁移到了google code并改名为MyBatis 。2013年11月MyBatis又迁移到Github。
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
Python爬虫精简步骤1 获取数据
爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。 爬虫能做很多事,能做商业分析,也能做生活助手,比如:分析北京近两年二手房成交均价是多少?广州的Python工程师平均薪资是多少?北京哪家餐厅粤菜最好吃?等等。 这是个人利用爬虫所做到的事情,而公司,同样可以利用爬虫来实现巨大的商业价值。比如你所熟悉的搜索引擎——百度和谷歌,它们的核心技术之一也是爬虫,而且是超级爬虫。 从搜索巨头到人工...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
web前端javascript+jquery知识点总结
1.Javascript 语法.用途 javascript 在前端网页中占有非常重要的地位,可以用于验证表单,制作特效等功能,它是一种描述语言,也是一种基于对象(Object)和事件驱动并具有安全性的脚本语言 ...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
渗透测试-灰鸽子远控木马
木马概述 灰鸽子( Huigezi),原本该软件适用于公司和家庭管理,其功能十分强大,不但能监视摄像头、键盘记录、监控桌面、文件操作等。还提供了黑客专用功能,如:伪装系统图标、随意更换启动项名称和表述、随意更换端口、运行后自删除、毫无提示安装等,并采用反弹链接这种缺陷设计,使得使用者拥有最高权限,一经破解即无法控制。最终导致被黑客恶意使用。原作者的灰鸽子被定义为是一款集多种控制方式于一体的木马程序...
Python:爬取疫情每日数据
前言 目前每天各大平台,如腾讯、今日头条都会更新疫情每日数据,他们的数据源都是一样的,主要都是通过各地的卫健委官网通报。 以全国、湖北和上海为例,分别为以下三个网站: 国家卫健委官网:http://www.nhc.gov.cn/xcs/yqtb/list_gzbd.shtml 湖北卫健委官网:http://wjw.hubei.gov.cn/bmdt/ztzl/fkxxgzbdgrfyyq/xxfb...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计...
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允许使用这...
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧???? 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升自...
粒子群算法求解物流配送路线问题(python)
1.Matlab实现粒子群算法的程序代码:https://www.cnblogs.com/kexinxin/p/9858664.html matlab代码求解函数最优值:https://blog.csdn.net/zyqblog/article/details/80829043 讲解通俗易懂,有数学实例的博文:https://blog.csdn.net/daaikuaichuan/article/...
教你如何编写第一个简单的爬虫
很多人知道爬虫,也很想利用爬虫去爬取自己想要的数据,那么爬虫到底怎么用呢?今天就教大家编写一个简单的爬虫。 下面以爬取笔者的个人博客网站为例获取第一篇文章的标题名称,教大家学会一个简单的爬虫。 第一步:获取页面 #!/usr/bin/python # coding: utf-8 import requests #引入包requests link = "http://www.santostang....
前端JS初级面试题二 (。•ˇ‸ˇ•。)老铁们!快来瞧瞧自己都会了么
1. 传统事件绑定和符合W3C标准的事件绑定有什么区别? 传统事件绑定 &lt;div onclick=""&gt;123&lt;/div&gt; div1.onclick = function(){}; &lt;button onmouseover=""&gt;&lt;/button&gt; 注意: 如果给同一个元素绑定了两次或多次相同类型的事件,那么后面的绑定会覆盖前面的绑定 (不支持DOM事...
情人节来了,教你个用 Python 表白的技巧
作者:@明哥 公众号:Python编程时光 2020年,这个看起来如此浪漫的年份,你还是一个人吗? 难不成我还能是一条狗? 18年的时候,写过一篇介绍如何使用 Python 来表白的文章。 虽然创意和使用效果都不错,但有一缺点,这是那个exe文件,女神需要打开电脑,才有可能参与进来,进而被你成功"调戏”。 由于是很早期的文章了,应该有很多人没有看过。 没有看过的,你可以点击这里查看:用Pyt...
用Python开发实用程序 – 计算器
作者:隋顺意 一段时间前,自己制作了一个库 “sui-math”。这其实是math的翻版。做完后,python既然可以轻易的完成任何的数学计算,何不用python开发一个小程序专门用以计算呢? 现在我们越来越依赖于计算器,很多复杂的计算都离不开它。我们使用过各式各样的计算器,无论是电脑自带的,还是网也上的计算器,却都没有自己动手编写属于自己计算器。今天就让我们走进计算器的世界,用python来编写...
经典算法(19)教你两分钟学会【选择排序】
这篇博客使用图文并茂的方式讲解选择排序算法,并有完整的算法逻辑以及代码实现。
Python学习笔记(语法篇)
本篇博客大部分内容摘自埃里克·马瑟斯所著的《Python编程:从入门到实战》(入门类书籍),采用举例的方式进行知识点提要 关于Python学习书籍推荐文章 《学习Python必备的8本书》 Python语法特点: 通过缩进进行语句组织 不需要变量或参数的声明 冒号 1 变量和简单数据结构 1.1 变量命名 只能包含字母、数字和下划线,且不能以数字打头。 1.2 字符串 在Python中,用引号...
用Python打造你的专属情人节贺卡,赶快发给TA浪漫一下吧
明天就是情人节了。这个情人节,注定是一个不能约会的情人节,但不能约会不代表不能浪漫。古人比我们出生早,那些浪漫的诗词早都被他们挖掘一空,比诗词我们肯定没有机会了。好在我们还有Python,不然都不知道该如何表达浪漫。接下来,浪导教你制作一个浪漫的情人节专属贺卡。
Python绘图与可视化
文章目录使用的库Matplotlib程序包绘图命令的扩展及其属性设置 使用的库 Python有很多可视化工具,如:Matplotlib。 Matplotlib是一种2D的绘图库,它可以支持硬拷贝和跨系统的交互,它可以在Python脚本、IPython的交互环境下、Web应用程序中使用。如果结合使用一种GUI工具包(如IPython),Matplotlib还具有诸如缩放和平移等交互功能。它不仅支持各...
相关热词 c# 为空 判断 委托 c#记事本颜色 c# 系统默认声音 js中调用c#方法参数 c#引入dll文件报错 c#根据名称实例化 c#从邮件服务器获取邮件 c# 保存文件夹 c#代码打包引用 c# 压缩效率
立即提问