#include "formimage.h" #include "ui_formimage.h" #include #include "CallManage.h" #include "forminfo.h" #include "formtrack.h" #include "geometryutils.h" #include "qtColorSchemeComboBox.h" extern double g_dPixelPerCm;//每厘米像素数 FormImage::FormImage(QWidget *parent, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName) : QWidget(parent), ui(new Ui::FormImage) { ui->setupUi(this); m_strSlfName = strSlfName; m_strWellName = strWellName; m_strTrackName = strTrackName; m_strLineName = strLineName; //LoadFromSLF_wave(); m_parent = parent; //斜井三图一表 // connect(CallManage::getInstance(), SIGNAL(sig_ChangeTvdProperty(QString, QString, QString, QString, QString, QString, QString, QVariant)), // this, SLOT(s_ChangeTvdProperty(QString, QString, QString, QString, QString, QString, QString, QVariant))); //自定义滚动条 //connect(CallManage::getInstance(), SIGNAL(sig_vertScrollBarChanged_santuyibiao(QString, double, double, double)), this, SLOT(vertScrollBarChanged(QString, double, double, double))); //打印 //connect(CallManage::getInstance(), SIGNAL(sig_vertScrollBarChanged_santu_Print(QString, int, int)), this, SLOT(vertScrollBarChanged_Print(QString, int, int))); connect(CallManage::getInstance(), SIGNAL(sig_vertScrollBarChanged(QString, double, double, double)), this, SLOT(vertScrollBarChanged(QString, double, double, double))); connect(CallManage::getInstance(), SIGNAL(sig_vertScrollBarChanged_setGeometry(QString, double, double, double, int)), this, SLOT(vertScrollBarChanged_setGeometry(QString, double, double, double, int))); connect(CallManage::getInstance(), SIGNAL(sig_ResizeDepth(QString, int, float)), this, SLOT(s_ResizeDepth(QString, int, float))); //黑白图 connect(CallManage::getInstance(), SIGNAL(sig_changeBlack(QString, bool)), this, SLOT(s_changeBlack(QString, bool))); } FormImage::~FormImage() { delete ui; } void FormImage::initGeometry(QString strUuid, int nscale, double fW, int nH) { if (strUuid.length() > 0) this->m_strUuid = strUuid; m_iScale = nscale; int ntmpw = fW * g_dPixelPerCm; this->setGeometry(0, 0, ntmpw - 2, (int)nH); //修改滚动条,针对新建的 emit CallManage::getInstance()->sig_changeScrollBar(m_strUuid); } void FormImage::setDepthY(float fy1, float fy2) { this->m_iY1 = fy1; this->m_iY2 = fy2; m_PlotSdep = qAbs(this->m_iY2); m_fTopY = m_PlotSdep; } void FormImage::updateDepthY(float fy1, float fy2) { this->m_iY1 = fy1; this->m_iY2 = fy2; m_fTopY = qAbs(this->m_iY2); update(); } bool FormImage::LoadFromSLF_wave() { CLogIO * logio = new CLogIO(); if (!logio->Open(m_strSlfName.toStdString().c_str(), CSlfIO::modeRead)) { delete logio; m_vMD.SetSize(0); m_vMD.m_vProperty = 0; m_vProperty.SetSize(0); m_vProperty.m_vProperty = NULL; return false; } int curveindex = logio->OpenWave(m_strLineName.toStdString().c_str()); if (curveindex < 0) { m_vMD.SetSize(0); m_vMD.m_vProperty = 0; m_vProperty.SetSize(0); m_vProperty.m_vProperty = NULL; delete logio; return false; } //m_ObjectType = WAVE_OBJECT; logio->GetWaveInfo(curveindex, &waveinfo); // if (m_ArrayNum > 1) { // if (waveinfo.RepCode == REPR_CHAR) waveinfo.RepCode = REPR_UCHAR; // } // acurveinfo.RepCode = waveinfo.RepCode; // acurveinfo.CodeLen = waveinfo.CodeLen; // acurveinfo.DepLevel = waveinfo.DepLevel; // acurveinfo.StartDepth = waveinfo.StartDepth; // acurveinfo.EndDepth = waveinfo.EndDepth; // isRun = true; int samplenum = (waveinfo.EndDepth - waveinfo.StartDepth) / waveinfo.DepLevel + 1.5; QString name = m_strSlfName + m_strLineName; // if (m_ArrayNum > 1) { // name += "Array"; // } // key = name; int nbpp = waveinfo.SamplePoint; int mlen = 0; int myWidth = 0; int chlen = 0; int nPadZ = 0; int myWidth1 = waveinfo.SamplePoint; int shift0 = 0; // if (m_ArrayNum > 1) { // shift0 = pMsa->shift0; // nPadZ = pMsa->nPadZ; // myWidth = pMsa->Width; // nbpp = pMsa->nSample; // m_ArrayNum = pMsa->nPad; // mlen = myWidth - m_ArrayNum * nbpp;//总盲区宽度 // mlen /= m_ArrayNum; // if (mlen % 2 != 0) mlen += 1; // if (nPadZ < 4) chlen = mlen / 8; // else chlen = mlen / 4; // if (chlen % 2 != 0) chlen += 1; // if (chlen == 0) chlen = 2; // // mlen=mlen-chlen; // mlen = m_ArrayNum * chlen / nPadZ; // if (mlen % 2 != 0) mlen++; // if (mlen > 20) mlen = 20; // if (chlen < 4) chlen = 4; // // chlen=(myWidth-(mlen*m_ArrayNum+nbpp*m_ArrayNum))/nPadZ; // int klen = pMsa->nPadZ*waveinfo.SamplePoint + mlen + pMsa->nPadZ*chlen; // myWidth1 = klen * pMsa->nPad / pMsa->nPadZ; // } // else myWidth = waveinfo.SamplePoint; int nlen = waveinfo.CodeLen*waveinfo.SamplePoint; int reclen = waveinfo.CodeLen*myWidth*waveinfo.ArrayNum; m_SDep = waveinfo.StartDepth; m_EDep = waveinfo.EndDepth; m_Rlev = waveinfo.DepLevel; m_nSamples = waveinfo.SamplePoint*waveinfo.ArrayNum; m_PointNum = (float)(fabs((m_EDep - m_SDep) / m_Rlev + 0.5)); m_sharedMemory.setKey(name); // 3. 创建或附加到共享内存 if (m_sharedMemory.isAttached()) { m_sharedMemory.detach(); } int nMemnum = 3 * sizeof(float) + sizeof(int) + reclen * (samplenum + 1); if (!m_sharedMemory.attach()) { // 尝试创建共享内存 if (!m_sharedMemory.create(nMemnum)) { qDebug() << "Failed to create shared memory:" << m_sharedMemory.errorString(); return false; } float *buffer = (float*)m_sharedMemory.data(); buffer[0] = waveinfo.StartDepth; buffer[1] = waveinfo.EndDepth; buffer[2] = waveinfo.DepLevel; ((int *)buffer)[3] = samplenum; char *pchar = (char *)&buffer[4]; //double laa = (double)reclen*(double)samplenum / waveinfo.CodeLen; int num = reclen * samplenum / waveinfo.CodeLen; float defval = -9999; if (waveinfo.RepCode == REPR_CHAR || waveinfo.RepCode == REPR_UCHAR) defval = 0; else if (waveinfo.RepCode == REPR_SHORT || waveinfo.RepCode == REPR_USHORT) defval = 0xffff; for (int i = 0; i < num; i++) { this->SetData(waveinfo.RepCode, &pchar[i*waveinfo.CodeLen], defval); } logio->ReadWave(curveindex, waveinfo.StartDepth, samplenum, (void *)pchar); } // 4. 锁定共享内存并写入数据 if (!m_sharedMemory.lock()) { qDebug() << "Failed to lock shared memory"; m_sharedMemory.detach(); return false; } m_vMD.SetSize(3); m_vMD.m_vProperty = (float *)m_sharedMemory.data(); int size = ((int *)m_sharedMemory.data())[3]; m_vProperty.SetSize(size); m_vProperty.m_vProperty = &m_vMD.m_vProperty[4]; if (m_vMD.size() > 0) { m_TopDepth = m_vMD.m_vProperty[0]; m_BottomDepth = m_vMD.m_vProperty[1]; m_Rlev = m_vMD.m_vProperty[2]; } float val = 0; valMin.clear(); valMax.clear(); valMin.resize((waveinfo.SamplePoint)*waveinfo.ArrayNum); valMax.resize((waveinfo.SamplePoint)*waveinfo.ArrayNum); for (int j = 0; j < (waveinfo.SamplePoint)*waveinfo.ArrayNum; j++) { valMin[j] = 999999999; valMax[j] = -99999999; } char buf[200]; for (int i = 0; i < samplenum; i++) { for (int j = 0; j < waveinfo.SamplePoint*waveinfo.ArrayNum; j++) { val = GetData(i, j, buf); if (val == 0 || val == -9999 || val == -999.25 || val == -99999 || val == -32767 || val == 32767) continue; if (qIsNaN(val) || !qIsFinite(val)) continue; if (valMax[j] < val)valMax[j] = val; if (valMin[j] > val)valMin[j] = val; } } if (waveinfo.MaxValue == -50 || waveinfo.MinValue == 50 || fabs(waveinfo.MaxValue) < 1e-6 || waveinfo.MinValue < 1e-6 || waveinfo.MaxValue == -99999 || waveinfo.MaxValue == -9999 || waveinfo.MinValue == 999999 || waveinfo.MinValue == 999999 || waveinfo.MinValue == 99999 || waveinfo.MinValue == 99999 || waveinfo.MinValue == -9999) { float valmin = 99999; float valmax = -99999; for (int j = 0; j < waveinfo.SamplePoint*waveinfo.ArrayNum; j++) { if (valmin > valMax[j]) valmin = valMax[j]; if (valmin > valMin[j]) valmin = valMin[j]; if (valmax < valMin[j]) valmin = valMin[j]; if (valmax < valMax[j]) valmax = valMax[j]; } waveinfo.MaxValue = valmax; waveinfo.MinValue = valmin; //BWAVEINFO.MaxValue = valmax; //BWAVEINFO.MinValue = valmin; //logio->SetWaveInfo(curveindex, &BWAVEINFO); } m_sharedMemory.unlock(); logio->Clear(); delete logio; return true; } void FormImage::setSchemIndex(int nidx) { schemIndex = nidx; m_rgbList = QtColorTableData::getInstance()->GetRgb_UseTag(1, schemIndex, 256); } void FormImage::paintEvent(QPaintEvent*) { // QPainter painter(this); QRect rect = this->rect(); // QRect rect = m_parent->rect(); //背景透明 painter.fillRect(rect.left(), rect.top(), rect.width(), rect.height(), QColor(0, 0, 0, 0)); //QColor(67, 67, 67, 100) if (m_formTrack) { if (m_pInfo == NULL) { m_pInfo = m_formTrack->getFormInfoByParameters(m_strUuid, m_strWellName, m_strTrackName, m_strLineName); } if (m_pInfo) { if (m_pInfo->m_bShow3D) this->DrawImage3D(&painter, rect); else this->DrawImage(&painter, rect); } } } void FormImage::s_ResizeDepth(QString strUuid, int nHeight, float fDepthLowerY) { if (m_strUuid != strUuid) return; this->setFixedHeight(nHeight); m_fDepthLowerY = qAbs(fDepthLowerY); m_fAddY = m_fDepthLowerY - m_fTopY; } void FormImage::s_changeBlack(QString strUuid, bool bBlack) { if (m_strUuid != strUuid || m_bBlack == bBlack) return; m_bBlack = bBlack; m_rgbList = QtColorTableData::getInstance()->GetRgb_UseTag(1, m_bBlack ? 2 : schemIndex, 256); update(); } //自定义滚动条 void FormImage::vertScrollBarChanged(QString strUuid, double value, double low, double upper) { if (m_strUuid == strUuid) { } else { return; } m_fTopY = value; update(); } //打印 void FormImage::vertScrollBarChanged_Print(QString strUuid, int iNum, int iHeightOfScreen) { if (m_strUuid == strUuid) { } else { return; } //上移或下移 QRect geoRect = geometry(); // double dDelta = iHeightOfScreen * (iNum - 1); setGeometry(0, -dDelta, geoRect.width(), geoRect.height()); } void FormImage::vertScrollBarChanged_setGeometry(QString strUuid, double value, double low, double upper, int ndepth) { if (m_strUuid == strUuid) { } else { return; } m_fTopY = ndepth; update(); } void FormImage::wheelEvent(QWheelEvent *event) // 滚轮事件 { emit CallManage::getInstance()->sig_mouseWheel(event); } void FormImage::DrawImage(QPainter* pdc, QRectF mrt1) { if (m_pInfo == NULL) { m_pInfo = m_formTrack->getFormInfoByParameters(m_strUuid, m_strWellName, m_strTrackName, m_strLineName); } if (m_pInfo == NULL) return; if (!m_pInfo->m_pImage) { m_pInfo->m_pImage = this; } CLogIO *logio = new CLogIO(); logio->Open(m_strSlfName.toStdString().c_str(), CSlfIO::modeRead); // int iIndex = logio->OpenWave(m_strLineName.toStdString().c_str()); if (iIndex < 0) { delete logio; return; } Slf_WAVE _wave; logio->GetWaveInfo(iIndex, &_wave); m_SDep = _wave.StartDepth; m_EDep = _wave.EndDepth; m_Rlev = _wave.DepLevel; float sdep, edep, flDepthScale = 18.897617f, temp; // 计算显示深度 float sdepc = m_fTopY, edepc = m_fTopY + m_fAddY; sdep = sdepc; edep = edepc; flDepthScale = mrt1.height() / (edepc - sdepc); if (edep > m_EDep) edep = m_EDep; if (sdep < m_SDep) sdep = m_SDep; if (sdep > m_EDep) return; if (edep < m_SDep) return; if (edep > m_EDep) edep = m_EDep; if (edep < sdep) edep = sdep; if (edep > m_EDep) edep = m_EDep; if (sdep > m_EDep) sdep = m_EDep; int incount = (edep - sdep) / m_Rlev; if (incount == 0) return; QRectF rt = mrt1; float flDep; int i, ii, j, nPoint = 0, m; QRectF wrt; float dep, ch; double ratio; CString cs; QString qs; int ytmp = -1; float y = 9999999.0; //计算数据点数 temp = _wave.TimeSamples; if (temp < 0) temp -= 0.5; nPoint = abs(temp); ratio = 1.0;// int((float)incount * 1000 / rt.height()) / 1000.0; //比例 char *value = new char[incount*nPoint*_wave.CodeLen]; //按块读数据 if (iIndex >= 0) { logio->ReadWave(iIndex, sdep, incount, (void *)value); } else memset(value, 0, incount*nPoint*_wave.CodeLen); float depcount = (float)incount / (edep - sdep); float depcount1 = 0; QSize qsize; int rh = mrt1.height(); int rw = this->size().width(); long nLnBytes = (nPoint * 3 + 3) / 4 * 4; unsigned char *pData = new unsigned char[nLnBytes*(int)(rh + 0.5)]; memset(pData, 255, nLnBytes*(int)(rh + 0.5)); int datatype = 0; int m_LeftVal = 0; int m_RightVal = 128; float m_flBackVal = -9999; if (m_pInfo) { datatype = m_pInfo->m_nCoord; m_LeftVal = m_pInfo->m_ImgMinVal; m_RightVal = m_pInfo->m_ImgMaxVal; m_flBackVal = -9999; schemIndex = m_pInfo->m_nSchemeIndex; } if (m_rgbList.size() <= 0) { m_rgbList = QtColorTableData::getInstance()->GetRgb_UseTag(1, schemIndex, 256); } QRgb rgbbg = QtColorTableData::getInstance()->getRgb_Bg(schemIndex); for (double dep1 = sdep; dep1 < edep; dep1 += ratio * m_Rlev) { y = (dep1 - sdepc)*flDepthScale; //y = ConvertY( eCoord_GEO,dep1,eCoord_GEONormal ); if (y < 0) continue; if (ytmp == int(y)) continue; else ytmp = y; wrt.setTop(y); depcount1 = (dep1 - sdep)*depcount; for (i = 0; i < nPoint; i++) { ch = GetData(_wave.RepCode, (char *)&value[(int(depcount1)*nPoint + i)*_wave.CodeLen]); if (wrt.top() >= rh) break; m = (int)wrt.top(); if (m_flBackVal != ch) { if (datatype == 0) //线性刻度 { ii = 256 * (ch - m_LeftVal) / (m_RightVal - m_LeftVal); } else { if (m_LeftVal < 1.0) ii = 256 * (log10(ch)) / log10(m_RightVal); else ii = 256 * (log10(ch) - log10(m_LeftVal)) / (log10(m_RightVal) - log10(m_LeftVal)); } if (ii > 254) ii = 254; if (ii < 0) ii = 0; pData[m*nLnBytes + 3 * i] = qRed(m_rgbList.at(ii)); pData[m*nLnBytes + 3 * i + 1] = qGreen(m_rgbList.at(ii)); pData[m*nLnBytes + 3 * i + 2] = qBlue(m_rgbList.at(ii)); } else { pData[m*nLnBytes + 3 * i] = qRed(rgbbg); pData[m*nLnBytes + 3 * i + 1] = qGreen(rgbbg); pData[m*nLnBytes + 3 * i + 2] = qBlue(rgbbg); } } } //read data end int nheight = rh; if (wrt.top() < rh - 1) nheight = (int)(wrt.top() + 0.5); //若数据行数小于rt.Height() //防止图片扭曲:同时限定每一行的数据大小可以保证 QImage membmp(pData, nPoint, nheight, 3 * nPoint, QImage::Format_RGB888); qsize.setWidth(rw - 2); qsize.setHeight(nheight); // 图像缩放 QImage result = membmp.scaled(qsize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); pdc->drawImage(rt.left() + 1, rt.top(), result); delete[]pData; pData = NULL; delete[]value; } void FormImage::DrawImage3D(QPainter* pdc, QRectF mrt) { if (m_pInfo == NULL) { m_pInfo = m_formTrack->getFormInfoByParameters(m_strUuid, m_strWellName, m_strTrackName, m_strLineName); } if (m_pInfo == NULL) return; if (!m_pInfo->m_pImage) { m_pInfo->m_pImage = this; } CLogIO *logio = new CLogIO(); logio->Open(m_strSlfName.toStdString().c_str(), CSlfIO::modeRead); // int iIndex = logio->OpenWave(m_strLineName.toStdString().c_str()); if (iIndex < 0) { delete logio; return; } Slf_WAVE _wave; logio->GetWaveInfo(iIndex, &_wave); m_SDep = _wave.StartDepth; m_EDep = _wave.EndDepth; m_Rlev = _wave.DepLevel; float sdep, edep, flDepthScale = 18.897617f, temp; // 计算显示深度 float sdepc = m_fTopY, edepc = m_fTopY + m_fAddY; sdep = sdepc; edep = edepc; flDepthScale = mrt.height() / (edepc - sdepc); if (sdep > m_EDep) sdep = m_EDep; if (edep < m_SDep) edep = m_SDep; if (sdep < m_SDep) sdep = m_SDep; if (edep > m_EDep) edep = m_EDep; if (edep < sdep) edep = sdep; int iDepCount = (edep - sdep) / m_Rlev; if (iDepCount == 0) return; // 计算开始数据点及数据点数 int nPoint, m; float flVal; //计算数据点数 temp = _wave.TimeSamples; if (temp < 0) temp -= 0.5; nPoint = abs(temp); // 绘制 QRectF wrt; int dep = 0; float detp = sdepc; int rh = mrt.height(); int rw = this->size().width(); double ratio = 1;// int((float)iDepCount * 1000 / rt.height()) / 1000.0; if (ratio > 1) ratio = 1; char *value = new char[iDepCount*nPoint*_wave.CodeLen]; long nLnBytes = (nPoint * 3 + 3) / 4 * 4; unsigned char *pData = new unsigned char[nLnBytes*(int)(rh + 0.5)]; memset(pData, 255, nLnBytes*(int)(rh + 0.5)); int m_iStartAngle = 20; int m_iStartPos = 0; int datatype = 0; int m_LeftVal = 0; int m_RightVal = 128; if (m_pInfo) { m_iStartAngle = m_pInfo->m_nOverlook; m_iStartPos = m_pInfo->m_nAzimuth; datatype = m_pInfo->m_nCoord; m_LeftVal = m_pInfo->m_ImgMinVal; m_RightVal = m_pInfo->m_ImgMaxVal; schemIndex = m_pInfo->m_nSchemeIndex; } //QList rgbList = QtColorTableData::getInstance()->GetRgb_UseTag(1, m_nSchemeIndex, 256); if (m_rgbList.size() <= 0) { m_rgbList = QtColorTableData::getInstance()->GetRgb_UseTag(1, schemIndex, 256); } float pi = 3.1415926; float angle = pi / ((float)nPoint / 2.0); int drawdep; float fangle = m_iStartAngle / 90.0; int r = rw / 4 * fangle; int dis = nPoint / 4; float flOffset = 0; int drawFlag = -1; int drawHead = 0; bool flag1 = ((sdep > detp) || (sdep > detp)); bool flag2 = ((m_SDep < sdep) || (m_SDep > sdep)); int ioffset = m_iStartPos * nPoint / 360.0 + 0.5; int ytmp = -1; for (double dep1 = sdep; dep1 < edep; dep1 += ratio * m_Rlev) { float y = (dep1 - sdepc)*flDepthScale; if (ytmp == int(y)) continue; else ytmp = y; wrt.setTop(y); drawFlag++; if (!drawFlag) drawHead = wrt.top(); if (!flag1) drawHead = r; if (!flag2) wrt.setTop(wrt.top() - r); if (wrt.top() == r) flOffset = dep1 - sdep; //画带头的圆柱 if (!flag1 || !flag2) { if (iIndex >= 0) { logio->ReadWave(iIndex, dep1 + flOffset, 1, (void *)value); } else memset(value, 0, m_nSamples*_wave.DepLevel); for (int i = 0; i <= nPoint / 2; i++) { drawdep = wrt.top() + r + r * sin(angle*i); flVal = GetData(_wave.RepCode, (char *)&value[(i + ioffset) % nPoint*_wave.CodeLen]); if (drawdep > rh - 1) continue; else { // if (m_flBackVal == flVal) // { // pData[drawdep*nLnBytes + 3 * (i + dis)] = GetBValue(m_GraInfo.GetBackgroundColour()); // pData[drawdep*nLnBytes + 3 * (i + dis) + 1] = GetGValue(m_GraInfo.GetBackgroundColour()); // pData[drawdep*nLnBytes + 3 * (i + dis) + 2] = GetRValue(m_GraInfo.GetBackgroundColour()); // } // else { int ii; if (datatype == 0) //线性刻度 { ii = 256 * (flVal - m_LeftVal) / (m_RightVal - m_LeftVal); } else { if (m_LeftVal < 1.0) ii = 256 * (log10(flVal)) / log10(m_RightVal); else ii = 256 * (log10(flVal) - log10(m_LeftVal)) / (log10(m_RightVal) - log10(m_LeftVal)); } if (ii > 254) ii = 254; if (ii < 0) ii = 0; pData[drawdep*nLnBytes + 3 * (i + dis)] = qRed(m_rgbList.at(ii));// GetBValue(pColorArr[ii]); pData[drawdep*nLnBytes + 3 * (i + dis) + 1] = qGreen(m_rgbList.at(ii));// GetGValue(pColorArr[ii]); pData[drawdep*nLnBytes + 3 * (i + dis) + 2] = qBlue(m_rgbList.at(ii));// GetRValue(pColorArr[ii]); } } } } /* else //不带头 { if (iIndex >= 0) { mrw.ReadWave(iIndex, dep1 - flOffset, 1, (void *)value); } else memset(value, 0, m_nSamples*WaveInfo.DepLevel); for (i = 0; i <= nPoint / 2; i++) { drawdep = wrt.top() - r + r * sin(angle*i); if (drawdep < 0) continue; else { flVal = GetData(WaveInfo.RepCode, (char *)&value[(i + ioffset) % nPoint*WaveInfo.CodeLen]); if (m_flBackVal == flVal) { pData[drawdep*nLnBytes + 3 * (i + dis)] = GetBValue(m_GraInfo.GetBackgroundColour()); pData[drawdep*nLnBytes + 3 * (i + dis) + 1] = GetGValue(m_GraInfo.GetBackgroundColour()); pData[drawdep*nLnBytes + 3 * (i + dis) + 2] = GetRValue(m_GraInfo.GetBackgroundColour()); } else { int ii; if (datatype == LINEAR) //线性刻度 { ii = 256 * (flVal - m_LeftVal) / (m_RightVal - m_LeftVal); } else { if (m_LeftVal < 1.0) ii = 256 * (log10(flVal)) / log10(m_RightVal); else ii = 256 * (log10(flVal) - log10(m_LeftVal)) / (log10(m_RightVal) - log10(m_LeftVal)); } if (ii > 255) ii = 255; if (ii < 0) ii = 0; pData[drawdep*nLnBytes + 3 * (i + dis)] = GetBValue(pColorArr[ii]); pData[drawdep*nLnBytes + 3 * (i + dis) + 1] = GetGValue(pColorArr[ii]); pData[drawdep*nLnBytes + 3 * (i + dis) + 2] = GetRValue(pColorArr[ii]); } } } }*/ } int nheight = rh; if (wrt.top() < rh - 1) nheight = (int)(wrt.top() + 0.5); long nLnBytes1 = (nPoint * 3 + 3) / 4 * 4; BYTE *pData1 = new BYTE[nLnBytes1*nheight]; memcpy(pData1, pData, nLnBytes1*nheight); QImage membmp(pData1, nPoint, nheight, 3 * nPoint, QImage::Format_RGB888); QSize qsize; qsize.setWidth(rw - 2); qsize.setHeight(nheight); // 图像缩放 QImage result = membmp.scaled(qsize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); pdc->drawImage(mrt.left() + 1, mrt.top(), result); delete[]pData1; delete[]pData; delete[]value; delete logio; } double FormImage::GetData(int i, int j, char *buffer) { float yy = -9999; if (m_vProperty.size() > i) { int pos = (int)(i*waveinfo.TimeSamples + j); yy = GetData(waveinfo.RepCode, (char *)&((char *)m_vProperty.m_vProperty)[pos*waveinfo.CodeLen], waveinfo.CodeLen); } return yy; } double FormImage::GetData(int repCode, char *buffer, int repLen) { double yy = -99999; if (!buffer) { return 0; } switch (repCode) { case REPR_INT: //0 yy = (double)(*((int*)buffer)); break; case REPR_SHORT: //1 yy = (double)(*((short *)buffer)); break; case REPR_LONG://2 yy = (double)(*((long *)buffer)); break; case REPR_FLOAT://3 yy = (double)(*((float *)buffer)); break; case REPR_DOUBLE://4 yy = (double)(*((double *)buffer)); break; case REPR_CHAR://5 yy = (double)(*((char *)buffer)); break; case REPR_UCHAR://6 yy = (double)(*((unsigned char *)buffer)); break; case REPR_USHORT://7 yy = (double)(*((unsigned short *)buffer)); break; case REPR_UINT://8 yy = (double)(*((unsigned int *)buffer)); break; case REPR_ULONG://9 yy = (double)(*((unsigned long *)buffer)); break; case REPR_STRING://10 if (repLen >= 200) repLen = 199; if (repLen > 0) { memmove(m_strValue, buffer, repLen); m_strValue[repLen] = 0; } else { m_strValue[0] = 0; yy = -99999; } break; } return yy; } void FormImage::SetData(int repCode, char *buffer, double yy) { if (!buffer) { return; } switch (repCode) { case REPR_INT: //0 (*((int*)buffer)) = (int)yy; break; case REPR_SHORT: //1 (*((short *)buffer)) = (short)yy; break; case REPR_LONG://2 (*((long *)buffer)) = (long)yy; break; case REPR_FLOAT://3 (*((float *)buffer)) = yy; break; case REPR_DOUBLE://4 (*((double *)buffer)) = (double)yy; break; case REPR_CHAR://5 (*((char *)buffer)) = (char)yy; break; case REPR_UCHAR://6 (*((unsigned char *)buffer)) = (unsigned char)yy; break; case REPR_USHORT://7 (*((unsigned short *)buffer)) = (unsigned short)yy; break; case REPR_UINT://8 (*((unsigned int *)buffer)) = (unsigned int)yy; break; case REPR_ULONG://9 (*((unsigned long *)buffer)) = (unsigned long)yy; break; case REPR_STRING://10 // *yy=-99999; break; } return; }