Beispiel #1
0
        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);
        }