<div dir="ltr">Thanks again! The problem was in the warper setup, it used only the first band of the image. This also revealed a bug in another part of my code related to VRT's and Warp, since I had added double sets of bands there as well. However, when fixing this, some old code stopped working :-)<div><br></div><div>Basically, my problem is that I want to reproject an RGB image which may be the VRT I made above, or another RGB(A) image, into  an output RGBA. If I don't have an input alpha channel, I still want the output to have alpha, and I want any borders that result from the reprojection to have alpha = 0. What is the correct way of setting up this? Currently I set up the bands like this:</div><div><br></div><div><span class="" style="white-space:pre">      </span>warpOptions->nBandCount = srcNumBands;<br></div><div><div><br></div><div><span class="" style="white-space:pre">    </span>warpOptions->panSrcBands = (int*)CPLMalloc(warpOptions->nBandCount*sizeof(int));</div><div><span class="" style="white-space:pre">     </span>warpOptions->panDstBands = (int*)CPLMalloc(warpOptions->nBandCount*sizeof(int));</div><div><br></div><div><span class="" style="white-space:pre">    </span>warpOptions->padfSrcNoDataReal = (double*)CPLMalloc(warpOptions->nBandCount*sizeof(double));<br></div><div><span class="" style="white-space:pre">       </span>warpOptions->padfSrcNoDataImag = (double*)CPLMalloc(warpOptions->nBandCount*sizeof(double));</div><div><br></div><div><span class="" style="white-space:pre">        </span>warpOptions->padfDstNoDataReal = (double*)CPLMalloc(warpOptions->nBandCount*sizeof(double));</div><div><span class="" style="white-space:pre"> </span>warpOptions->padfDstNoDataImag = (double*)CPLMalloc(warpOptions->nBandCount*sizeof(double));</div><div><br></div><div><span class="" style="white-space:pre">        </span>for (int j = 0; j < warpOptions->nBandCount; j++)</div><div><span class="" style="white-space:pre">    </span>{</div><div><span class="" style="white-space:pre">          </span>warpOptions->panSrcBands[j] = j+1;</div><div><span class="" style="white-space:pre">              </span>warpOptions->panDstBands[j] = j+1;</div><div><br></div><div><span class="" style="white-space:pre">             </span>warpOptions->padfSrcNoDataReal[j] = _srcNodata;</div><div><span class="" style="white-space:pre">         </span>warpOptions->padfSrcNoDataImag[j] = 0.0;</div><div><br></div><div><span class="" style="white-space:pre">               </span>warpOptions->padfDstNoDataReal[j] = _nodata;</div><div><span class="" style="white-space:pre">            </span>warpOptions->padfDstNoDataImag[j] = 0.0;</div><div><span class="" style="white-space:pre">        </span>}</div><div><br></div><div><span class="" style="white-space:pre"> </span>if (srcNumBands == 4)</div><div><span class="" style="white-space:pre">              </span>warpOptions->nSrcAlphaBand = 4;</div><div><br></div><div><span class="" style="white-space:pre">        </span>if (dstNumBands == 4)</div><div><span class="" style="white-space:pre">              </span>warpOptions->nDstAlphaBand = 4;</div></div><div><br></div><div><div><span class="" style="white-space:pre"> </span>char **papszWarpOptions = NULL;</div><div><span class="" style="white-space:pre">    </span>papszWarpOptions = CSLSetNameValue(papszWarpOptions, "INIT_DEST", "NO_DATA" );</div></div><div><br></div><div>In some cases this works, but in others I get only a black image after the warp. So my question is basically if the above code should have worked. My assumption here is that the GDAL Warper will regard all input pixels as having full opacity when no alpha channel is specified, and that output alpha is initialized to 0. Are these valid assumptions, or do I need to create an alpha channel in the input image as well?</div><div><br></div><div>- Thomas</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 11, 2015 at 5:25 PM, Even Rouault <span dir="ltr"><<a href="mailto:even.rouault@spatialys.com" target="_blank">even.rouault@spatialys.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Selon Thomas Sevaldrud <<a href="mailto:thomas@silentwings.no">thomas@silentwings.no</a>>:<br>
<span class=""><br>
> Great, thanks!<br>
><br>
> I tried this, but got only a red image as result, so I guess only the first<br>
> channel was used.<br>
><br>
> This is the relevant code, where _ds is the input paletted data set<br>
><br>
> vrtDS = vrtDriver->Create("", origW, origH, 3, GDT_Byte, NULL);<br>
> double geoTransform[6];<br>
> _ds->GetGeoTransform(geoTransform);<br>
> vrtDS->SetGeoTransform(geoTransform);<br>
> GDALSetProjection(vrtDS, _srcProjectionWKT.c_str());<br>
><br>
> GDALRasterBand* srcBand = _ds->GetRasterBand(1);<br>
><br>
> vrtDS->AddBand(GDT_Byte, NULL);<br>
> vrtDS->AddBand(GDT_Byte, NULL);<br>
> vrtDS->AddBand(GDT_Byte, NULL);<br>
<br>
</span>You don't need the above 3 AddBand() since you called Create() with 3 already<br>
<span class=""><br>
> VRTSourcedRasterBand* vrtRBand =<br>
> (VRTSourcedRasterBand*)vrtDS->GetRasterBand(1);<br>
> VRTSourcedRasterBand* vrtGBand =<br>
> (VRTSourcedRasterBand*)vrtDS->GetRasterBand(2);<br>
> VRTSourcedRasterBand* vrtBBand =<br>
> (VRTSourcedRasterBand*)vrtDS->GetRasterBand(3);<br>
> vrtRBand->AddComplexSource(srcBand, -1, -1, -1, -1, -1, -1, -1, -1, 0.0,<br>
> 1.0, VRT_NODATA_UNSET, 1);<br>
> vrtGBand->AddComplexSource(srcBand, -1, -1, -1, -1, -1, -1, -1, -1, 0.0,<br>
> 1.0, VRT_NODATA_UNSET, 2);<br>
> vrtBBand->AddComplexSource(srcBand, -1, -1, -1, -1, -1, -1, -1, -1, 0.0,<br>
> 1.0, VRT_NODATA_UNSET, 3);<br>
><br>
> Is there anything I have missed in the setup here?<br>
<br>
</span>Looks good otherwise. Did you check that you configured properly the warper to<br>
use the 3 bands of the VRT ?<br>
<div class="HOEnZb"><div class="h5">><br>
> - Thomas<br>
><br>
><br>
><br>
> On Tue, Jun 9, 2015 at 1:44 PM, Even Rouault <<a href="mailto:even.rouault@spatialys.com">even.rouault@spatialys.com</a>><br>
> wrote:<br>
><br>
> > Thomas,<br>
> > ><br>
> > > I'm using the GDALWarp api from C++ to reproject and cut various input<br>
> > > images. In general this works very well for my purposes, except that for<br>
> > > paletted images I have to use NearestNeighbour resampling,<br>
> > ><br>
> > > I would like to use Bilinear or higher order resampling, and wonder if<br>
> > > there is any way to expand a paletted image to true RGB during the warp<br>
> > > process, so I can use these resampling methods.<br>
> ><br>
> > No, you must use an intermediate step before.<br>
> ><br>
> > ><br>
> > > Alternatively, is there a way to do this conversion (from code) before<br>
> > the<br>
> > > warp without having to run through the entire image in memory?<br>
> ><br>
> > You can use a in-memory VRT dataset to do on-the-fly expansion to RGB.<br>
> ><br>
> > With the AddComplexSource() method of VRTSourcedRasterBand class:<br>
> ><br>
> >     CPLErr         AddComplexSource( GDALRasterBand *poSrcBand,<br>
> >                                      int nSrcXOff=-1, int nSrcYOff=-1,<br>
> >                                      int nSrcXSize=-1, int nSrcYSize=-1,<br>
> >                                      int nDstXOff=-1, int nDstYOff=-1,<br>
> >                                      int nDstXSize=-1, int nDstYSize=-1,<br>
> >                                      double dfScaleOff=0.0,<br>
> >                                      double dfScaleRatio=1.0,<br>
> >                                      double dfNoDataValue =<br>
> > VRT_NODATA_UNSET,<br>
> >                                      int nColorTableComponent = 0);<br>
> ><br>
> > Set nColorTableComponent to 1,2,3 for respectively R,G,B. This is what<br>
> > gdal_translate will do if you use "gdal_translate -of VRT -expand rgb<br>
> > pct.tif<br>
> > out.vrt"<br>
> ><br>
> > Even<br>
> ><br>
> > --<br>
> > Spatialys - Geospatial professional services<br>
> > <a href="http://www.spatialys.com" rel="noreferrer" target="_blank">http://www.spatialys.com</a><br>
> ><br>
><br>
<br>
<br>
--<br>
Spatialys - Geospatial professional services<br>
<a href="http://www.spatialys.com" rel="noreferrer" target="_blank">http://www.spatialys.com</a><br>
</div></div></blockquote></div><br></div>