Qt QImage-> setPixel超出预期范围

时间:2014-07-17 14:40:24

标签: qt qimage qt4.8

我正在尝试根据高度设置像素颜色。我将屏幕分为两部分,如果高度小于,则根据高度设置像素 中点像素颜色设置为一种颜色,更大的值设置为不同的颜色。问题是在具有前半颜色的中间点之后设置的像素很少。 我是图形新手亲切的建议。但是通过相同的计算,我能够准确地在中间绘制线条。 我的代码: int setImagePixcels(float& pX1,float& pY1,float& pX2,float& pY2) {

int lValue = 0 ,pixelValY2=0, pixelValY1=0, pixelValX1=0, pixelValX2=0 ;
int width= 0, height=0 , maxY=0,maxX=0,startx=0,starty=0;
FILE *myFile=NULL;
QRgb rgblo; 

pixelValX1= vPlotXY->getPixelXFromValueX(pX1); //px1 is  x1
pixelValX2= vPlotXY->getPixelXFromValueX(pX2); // px2 is x2

startx = vPlotXY->vAxisPositionInPixels[LEFT]; //Starting point of x
starty = vPlotXY->vAxisPositionInPixels[TOP];  //starting point of y

pixelValY1= vPlotXY->getPixelYFromValueY(pY1);     //py1 is  y1
pixelValY2= vPlotXY->getPixelYFromValueY(pY2);     //py2 is  y2


width = (vPlotXY->vAxisPositionInPixels[RIGHT]-vPlotXY->vAxisPositionInPixels[LEFT]); //width of the screen
height =(vPlotXY->vAxisPositionInPixels[BOTTOM]-vPlotXY->vAxisPositionInPixels[TOP]); //height of the screen

float slope =(float) (pixelValY2-pixelValY1)/(pixelValX2-pixelValX1);


  myFile = fopen("C:\\MyLearning\\myData.txt","w+");
  if(!myFile)
  {
    //  cout<<"error"; failure.
  }

 //int dy = (pixelValY2-pixelValY1); // This the delta for y
 //int dx = (pixelValX2-pixelValX1); // This the delta for x
 maxY = vPlotXY->vAxisPositionInPixels[BOTTOM];
 maxX = vPlotXY->vAxisPositionInPixels[RIGHT];

 for(int y= starty;y<maxY;y++)
 {      
    for(int  x= startx;x<maxX;x++)
    {
        int midHeight = vPlotXY->getPixelYFromValueY(1500); 
        //float lineVal = (dy*x)-(dx*y)+(dx);
        //if((lineVal< 0)&& (axisVal[x-startx][y-starty]==0))
        if(y<midHeight)
        {
            vColor = 1;
        }
        else
        {

                vColor = 2;

        }

        //  axisVal[x-startx][y-starty]=vColor;


            switch(vColor)
            {
                case GridColor::CYAN:
                rgblo= qRgb(0,255,255);

                break;
                case GridColor::SPRINGGREEN:
                rgblo= qRgb(0   ,250,   154);
                break;
                case GridColor::GREEN:
                    rgblo= qRgb(0   ,205,   102);
                break;  

                case GridColor::DODERBLUE:
                    rgblo= qRgb(30  ,144    ,255);
                break;
                case GridColor::SGI_SALMON:
                    rgblo= qRgb(198,    113,    113);
                break;
                case GridColor::SGI_OLIVERDRAB:
                    rgblo= qRgb(142 ,142    ,56);
                break;
                case GridColor::SGI_LIGHTBLUE:
                break;
                case GridColor::MEDIUMORCHID:
                    rgblo= qRgb(186,85,211);
                break;
                case GridColor::YELLOW:
                    rgblo= qRgb(255,255,0);
                break;
                case GridColor::MEDIUMPURPLE:
                    rgblo= qRgb(147,    112,    219);
                break;
                default:
                    rgblo= qRgb(255 ,255,255);
                    break;

            }
                vImage->setPixel(x-75,y-89,rgblo);


        //fprintf(myFile, "(x=%d, y=%d)=(%d)", x,y,axisVal[x][y]);   
        //}
    }
    fprintf(myFile, "\n");
}
fclose(myFile);

return  lValue;

}

1 个答案:

答案 0 :(得分:0)

  

在上半部分的中间点之后设置了少数像素   颜色。

我将开始检查中间点的定义。作为下面的代码,我不明白这个getPixelYfromValueY()函数是如何工作的。当声明的函数名称时,它看起来像是获取颜色值而不是midHeight Y位置,并且您在for循环中使用它来进行比较。我相信这是个问题。

int midHeight = vPlotXY->getPixelYFromValueY(1500);