public FreeImageAlgorithmsBitmap LoadFreeImageBitmap(string filepath) { // all overloaded functions come through this method FreeImageAlgorithmsBitmap fib = null; if (!System.IO.File.Exists(filepath)) { this.dummyTile = true; return(new FreeImageAlgorithmsBitmap(this.Width, this.Height, this.FreeImageType, this.colorDepth)); } if (!(Tile.isCompositeRGB)) { fib = LoadFreeImageBitmapFromFile(filepath); } else //// Composite RGB: Insert 3 grey images into 1 24-bit colour image { FreeImageAlgorithmsBitmap fib8 = null; int n = Tile.nCompositeImages; // Crop images differently to apply the channel shift // shift for channel 0 will always be 0,0 but // crop for the channel with the min shift will be 0 to width-range and // crop for the channel with the max shift will be range to width. int minX, minY, midX, midY, maxX, maxY, rX, rY; int[] orderX = new int[3], orderY = new int[3]; int[] x = new int[3], y = new int[3]; x[0] = -Tile.channelShift[0].X; x[1] = -Tile.channelShift[1].X; x[2] = -Tile.channelShift[2].X; y[0] = -Tile.channelShift[0].Y; y[1] = -Tile.channelShift[1].Y; y[2] = -Tile.channelShift[2].Y; OrderShifts(x, orderX, out minX, out midX, out maxX); OrderShifts(y, orderY, out minY, out midY, out maxY); // ranges rX = maxX - minX; rY = maxY - minY; int[] shiftXl = new int[3], shiftYt = new int[3]; int[] shiftXr = new int[3], shiftYb = new int[3]; shiftXl[0] = 0; // the shift for min shift channel shiftXr[0] = rX; // the shift for min shift channel shiftXl[1] = midX - minX; shiftXr[1] = maxX - midX; shiftXl[2] = rX; // the shift for max shift channel shiftXr[2] = 0; // the shift for max shift channel shiftYt[0] = 0; // the shift for min shift channel shiftYb[0] = rY; // the shift for min shift channel shiftYt[1] = midY - minY; shiftYb[1] = maxY - midY; shiftYt[2] = rY; // the shift for max shift channel shiftYb[2] = 0; // the shift for max shift channel fib8 = LoadFreeImageBitmapFromFile(this.getFilePath(0)); fib8.LinearScaleToStandardType(Tile.scaleMin[0], Tile.scaleMax[0]); // fib8.Crop(0, 2, fib8.Width - 1 - 4, fib8.Height - 1); fib8.Crop(shiftXl[orderX[0]], shiftYt[orderY[0]], fib8.Width - 1 - shiftXr[orderX[0]], fib8.Height - 1 - shiftYb[orderY[0]]); fib = new FreeImageAlgorithmsBitmap(fib8.Width, fib8.Height, FREE_IMAGE_TYPE.FIT_BITMAP, 24); FreeImage.SetChannel(fib.Dib, fib8.Dib, Tile.channel[0]); fib8.Dispose(); fib8 = LoadFreeImageBitmapFromFile(this.getFilePath(1)); fib8.LinearScaleToStandardType(Tile.scaleMin[1], Tile.scaleMax[1]); // fib8.Crop(4, 0, fib8.Width - 1, fib8.Height - 1 - 2); fib8.Crop(shiftXl[orderX[1]], shiftYt[orderY[1]], fib8.Width - 1 - shiftXr[orderX[1]], fib8.Height - 1 - shiftYb[orderY[1]]); FreeImage.SetChannel(fib.Dib, fib8.Dib, Tile.channel[1]); fib8.Dispose(); if (n == 3) // may not have 3 files but should have at least 2 { fib8 = LoadFreeImageBitmapFromFile(this.getFilePath(2)); fib8.LinearScaleToStandardType(Tile.scaleMin[2], Tile.scaleMax[2]); // fib8.Crop(2, 1, fib8.Width - 1 - 2, fib8.Height - 1 - 1); fib8.Crop(shiftXl[orderX[2]], shiftYt[orderY[2]], fib8.Width - 1 - shiftXr[orderX[2]], fib8.Height - 1 - shiftYb[orderY[2]]); FreeImage.SetChannel(fib.Dib, fib8.Dib, Tile.channel[2]); fib8.Dispose(); } } // Resample seems to only work for uint16 not int16 currently if (fib.ImageType == FREE_IMAGE_TYPE.FIT_INT16) { fib.ConvertInt16ToUInt16(); } return(fib); }