public static void Test(string imgdir, Func <string, MemBitmap> imgLoader) { SimpleBitmapAtlasBuilder bmpAtlasBuilder = new SimpleBitmapAtlasBuilder(); //test! int imgdirNameLen = imgdir.Length; string[] filenames = System.IO.Directory.GetFiles(imgdir, "*.png"); ushort index = 0; Dictionary <string, ushort> imgDic = new Dictionary <string, ushort>(); foreach (string f in filenames) { MemBitmap itemBmp = imgLoader(f); AtlasItemImage atlasItem = new AtlasItemImage(itemBmp.Width, itemBmp.Height); atlasItem.OriginalBounds = new PixelFarm.Drawing.RectangleF(0, 0, itemBmp.Width, itemBmp.Height); atlasItem.SetBitmap(itemBmp, false); // bmpAtlasBuilder.AddAtlasItemImage(index, atlasItem); string imgPath = f.Substring(imgdirNameLen); imgDic.Add(imgPath, index); index++; //------------ #if DEBUG if (index >= ushort.MaxValue) { throw new NotSupportedException(); } #endif //------------ } //string atlasInfoFile = "d:\\WImageTest\\test1_atlas.info"; //string totalImgFile = "d:\\WImageTest\\test1_atlas.png"; string atlasInfoFile = "test1_atlas.info"; string totalImgFile = "test1_atlas.png"; //test, write data to disk AtlasItemImage totalImg = bmpAtlasBuilder.BuildSingleImage(); bmpAtlasBuilder.ImgUrlDict = imgDic; bmpAtlasBuilder.SetAtlasInfo(TextureKind.Bitmap); bmpAtlasBuilder.SaveAtlasInfo(atlasInfoFile); //save to filename totalImg.Bitmap.SaveImage(totalImgFile); //----- //test, read data back bmpAtlasBuilder = new SimpleBitmapAtlasBuilder(); SimpleBitmaptAtlas bitmapAtlas = bmpAtlasBuilder.LoadAtlasInfo(atlasInfoFile); // MemBitmap totalAtlasImg = imgLoader(totalImgFile); AtlasItemImage atlasImg = new AtlasItemImage(totalAtlasImg.Width, totalAtlasImg.Height); bitmapAtlas.TotalImg = atlasImg; for (int i = 0; i < index; ++i) { if (bitmapAtlas.TryGetBitmapMapData((ushort)i, out BitmapMapData bmpMapData)) { //test copy data from bitmap MemBitmap itemImg = totalAtlasImg.CopyImgBuffer(bmpMapData.Left, bmpMapData.Top, bmpMapData.Width, bmpMapData.Height); itemImg.SaveImage("test1_atlas_item" + i + ".png"); } } //test, { if (bitmapAtlas.TryGetBitmapMapData(@"\chk_checked.png", out BitmapMapData bmpMapData)) { MemBitmap itemImg = totalAtlasImg.CopyImgBuffer(bmpMapData.Left, bmpMapData.Top, bmpMapData.Width, bmpMapData.Height); itemImg.SaveImage("test1_atlas_item_a.png"); } } }
public static void BuildBitmapAtlas(AtlasProject atlasProj, Func <string, MemBitmap> imgLoader, bool test_extract = false) { //demonstrate how to build a bitmap atlas List <AtlasItemSourceFile> fileList = atlasProj.Items; //1. create builder var bmpAtlasBuilder = new SimpleBitmapAtlasBuilder(); ushort index = 0; Dictionary <string, ushort> imgDic = new Dictionary <string, ushort>(); foreach (AtlasItemSourceFile f in fileList) { if (f.Kind != AtlasItemSourceKind.Image) { continue; } //3. load a bitmap BitmapAtlasItemSource atlasItem = null; using (MemBitmap itemBmp = imgLoader(f.AbsoluteFilename)) { //4. get information about it atlasItem = new BitmapAtlasItemSource(itemBmp.Width, itemBmp.Height); atlasItem.SetImageBuffer(MemBitmap.CopyImgBuffer(itemBmp)); } atlasItem.UniqueInt16Name = index; //5. add to builder bmpAtlasBuilder.AddItemSource(atlasItem); //get relative filename string imgPath = "//" + f.Link; imgDic.Add(imgPath, index); index++; //------------ #if DEBUG if (index >= ushort.MaxValue) { throw new NotSupportedException(); } #endif //------------ } if (imgDic.Count == 0) { //no file return; } string atlasInfoFile = atlasProj.OutputFilename + ".info"; string totalImgFile = atlasProj.OutputFilename + ".png"; //5. merge all small images into a bigone using (MemBitmap totalImg = bmpAtlasBuilder.BuildSingleImage(false)) { bmpAtlasBuilder.ImgUrlDict = imgDic; bmpAtlasBuilder.SetAtlasInfo(TextureKind.Bitmap, 0); //font size //6. save atlas info and total-img (.png file) bmpAtlasBuilder.SaveAtlasInfo(atlasInfoFile); totalImg.SaveImage(totalImgFile); } //---------------------- //7. create an atlas file in a source file version, user can embed the source to file //easy, just read .info and .png then convert to binary buffer BuildAtlasInEmbededSourceVersion(atlasProj, atlasInfoFile, totalImgFile, imgDic); //---------------------- //test, read data back //---------------------- if (test_extract) { bmpAtlasBuilder = new SimpleBitmapAtlasBuilder(); SimpleBitmapAtlas bitmapAtlas = bmpAtlasBuilder.LoadAtlasInfo(atlasInfoFile)[0]; // MemBitmap totalAtlasImg = imgLoader(totalImgFile); bitmapAtlas.SetMainBitmap(imgLoader(totalImgFile), true); //----- for (int i = 0; i < index; ++i) { if (bitmapAtlas.TryGetItem((ushort)i, out AtlasItem bmpMapData)) { //test copy data from bitmap MemBitmap itemImg = totalAtlasImg.CopyImgBuffer(bmpMapData.Left, bmpMapData.Top, bmpMapData.Width, bmpMapData.Height); itemImg.SaveImage("test1_atlas_item" + i + ".png"); } } //test, { if (bitmapAtlas.TryGetItem(@"\chk_checked.png", out AtlasItem bmpMapData)) { MemBitmap itemImg = totalAtlasImg.CopyImgBuffer(bmpMapData.Left, bmpMapData.Top, bmpMapData.Width, bmpMapData.Height); itemImg.SaveImage("test1_atlas_item_a.png"); } } } }