http://osgeo-org.1803224.n2.nabble.com/file/n7175677/Image.cpp Image.cpp
Ari, void CViewMain::OnDraw() { .... if (m_image.IsOpen()) { m_image.Draw(hdcMem,m_image.m_XOff,m_image.m_YOff,m_image.m_imgWidth,m_image.m_imgHeight, m_image.m_xSrc,m_image.m_ySrc,m_image.m_srcWidth,m_image.m_srcHeight, 1,1,1); } .... } void CViewMain::OnGdalOpen() { LPCTSTR szFilter = _T("Windows bitmap(*.bmp)|*.bmp|All Files (*.*)|*.*||"); CString filePath(_T("")); CFileDialog fileOpenDlg(TRUE, _T("bmp"), NULL,OFN_HIDEREADONLY,szFilter); if (fileOpenDlg.DoModal() == IDOK) { VERIFY(filePath = fileOpenDlg.GetPathName()); } const char* pszFilename = CStringToCharUTF8(filePath); m_image.Open(filePath); } void CGDALImage::Draw(CDC *pDC, long xOff, long yOff, long width, long height, long xSrc, long ySrc, long srcWidth, long srcHeight, long rband, long gband, long bband) { if(pDC==NULL) return; if (!m_pDataset) return; if(m_DC.m_hDC>0) m_DC.Detach(); m_DC.Attach(pDC->m_hDC); m_hdc=pDC->m_hDC; if (rband == 0 || rband>m_bandNum) rband = m_CurrentBand; if (gband == 0 || gband>m_bandNum) gband = m_CurrentBand; if (bband == 0 || bband>m_bandNum) bband = m_CurrentBand; m_red=rband; m_green=gband; m_blue=bband; if(xSrc<0 ||xSrc >m_imgWidth) xSrc=0; if(ySrc<0 ||ySrc >m_imgHeight) ySrc=0; if(srcWidth<1 || srcWidth > m_imgWidth) srcWidth=m_imgWidth; if(srcHeight<1 || srcHeight > m_imgHeight) srcHeight=m_imgHeight; m_XOff=xSrc;//¶БИлµЅДЪґжµДУ°ПсЖрКјО»ЦГ m_YOff=ySrc; m_buffWidth=srcWidth;//»єґжµДёЯ¶ИЈ¬їн¶И m_buffHeight=srcHeight; if(double(width)/ double(height)>double(srcWidth)/double(srcHeight))//±ЈЦ¤і¤їнІ»»ы±д { double tmp=height*double(srcWidth)/double(srcHeight); width=tmp-long(tmp)>0.5?long(tmp)+1:long(tmp); } else { double tmp=width*double(srcHeight)/double(srcWidth); height=tmp-long(tmp)>0.5?long(tmp)+1:long(tmp); } m_WndWidth=width; m_WnDHeight=height; m_WndXOff=xOff; m_WndYOff=yOff; m_xSrc=xSrc; m_ySrc=ySrc; m_srcWidth=srcWidth; m_srcHeight= srcHeight; //byte* buf = new byte[srcWidth*srcHeight]; int dataType=0; if(m_DataType=="Byte")dataType=0; if(m_DataType=="UInt16")dataType=1; if(m_DataType=="Int16")dataType=2; if(m_DataType=="UInt32")dataType=3; if(m_DataType=="Int32")dataType=4; if(m_DataType=="Float32")dataType=5; if(m_DataType=="Float64")dataType=6; if(m_DataType=="CInt16")dataType=7; if(m_DataType=="CInt32")dataType=8; if(m_DataType=="CFloat32")dataType=9; if(m_DataType=="CFloat64")dataType=10; GDALRasterBand *m_pBand=NULL; byte* m_ByteBuff; float* m_FloatBuff; byte* buf =NULL; float* buffFloat=NULL; int x,y; CDC dcMem; dcMem.CreateCompatibleDC(pDC); CBitmap bitmap; bitmap.CreateCompatibleBitmap(pDC,width,height); dcMem.SelectObject(&bitmap); int i; switch(dataType) { case 0://byteѕНbyte m_ByteBuff = new byte[width*height*3]; m_buffHeight=height; m_buffWidth=width; m_buffSize=height*width*3; buf = new byte[width*height]; m_pBand = m_pDataset->GetRasterBand(rband); if (m_pBand) { if (CE_None==m_pBand->RasterIO( GF_Read, xSrc,ySrc, srcWidth, srcHeight, buf, width,height, GDT_Byte, 0, 0 )) { for ( i = 0; i < width*height; i ++) m_ByteBuff[3*i+2] = buf[i]; } } m_pBand = m_pDataset->GetRasterBand(gband); if (m_pBand) { if (CE_None==m_pBand->RasterIO( GF_Read, xSrc,ySrc, srcWidth, srcHeight, buf, width,height, GDT_Byte, 0, 0 )) { for ( i = 0; i <width*height; i ++) m_ByteBuff[3*i+1] = buf[i]; } } m_pBand = m_pDataset->GetRasterBand(bband); if (m_pBand) { if (CE_None==m_pBand->RasterIO( GF_Read, xSrc,ySrc, srcWidth, srcHeight, buf, width,height, GDT_Byte, 0, 0 )) { for ( i = 0; i < width*height; i ++) m_ByteBuff[3*i+0] = buf[i]; } } for ( x = 0; x < width; x ++) { for ( y = 0; y < height; y ++) { dcMem.SetPixel(x,y,RGB(m_ByteBuff[(y*width+x)*3+2],m_ByteBuff[(y*width+x)*3+1],m_ByteBuff[(y*width+x)*3+0])); } } pDC->BitBlt(xOff,yOff,width,height,&dcMem,0,0,SRCCOPY); delete buf; delete m_ByteBuff; m_ByteBuff=NULL; buf=NULL; break; default://ЖдЛыАаРНµД¶јУГfloat m_FloatBuff = new float[width*height*3]; m_buffHeight=height; m_buffWidth=width; m_buffSize=height*width*3; buffFloat = new float[width*height]; m_pBand = m_pDataset->GetRasterBand(rband); if (m_pBand) { if (CE_None==m_pBand->RasterIO( GF_Read, xSrc,ySrc, srcWidth, srcHeight, buffFloat, width,height, GDT_Float32, 0, 0 )) { for ( i = 0; i <width*height; i ++) m_FloatBuff[3*i+2] = buffFloat[i]; } } m_pBand = m_pDataset->GetRasterBand(gband); if (m_pBand) { if (CE_None==m_pBand->RasterIO( GF_Read, xSrc,ySrc, srcWidth, srcHeight, buffFloat, width,height, GDT_Float32, 0, 0 )) { for ( i = 0; i <width*height; i ++) m_FloatBuff[3*i+1] = buffFloat[i]; } } m_pBand = m_pDataset->GetRasterBand(bband); if (m_pBand) { if (CE_None==m_pBand->RasterIO( GF_Read, xSrc,ySrc, srcWidth, srcHeight, buffFloat, width,height, GDT_Float32, 0, 0 )) { for ( i = 0; i < width*height; i ++) m_FloatBuff[3*i+0] = buffFloat[i]; } } for ( x = 0; x < width; x ++) { for ( y = 0; y < height; y ++) { dcMem.SetPixel(x,y,RGB(m_FloatBuff[(y*width+x)*3+2],m_FloatBuff[(y*width+x)*3+1],m_FloatBuff[(y*width+x)*3+0])); } } pDC->BitBlt(xOff,yOff,width,height,&dcMem,0,0,SRCCOPY); delete buffFloat; delete m_FloatBuff; m_FloatBuff=NULL; buffFloat=NULL; break; } } For imagesc with bands >= 3 the OnDraw function works fine: m_image.Draw(hdcMem,m_image.m_XOff,m_image.m_YOff,m_image.m_imgWidth,m_image.m_imgHeight, m_image.m_xSrc,m_image.m_ySrc,m_image.m_srcWidth,m_image.m_srcHeight, 1,2,3); Best Regards -- View this message in context: http://osgeo-org.1803224.n2.nabble.com/gdal-dev-Problem-w-images-with-one-raster-band-tp7175398p7175677.html Sent from the GDAL - Dev mailing list archive at Nabble.com. _______________________________________________ gdal-dev mailing list gdal-dev@lists.osgeo.org http://lists.osgeo.org/mailman/listinfo/gdal-dev