static void Main(string[] args) { if (args.Length < 2) { Console.WriteLine("Usage: fCraftImg.exe <map filename> <output png> [rotation (0-3)] [mode] [x y z x2 y2 z2]"); return; } int i = 0; string filename = args[i++]; string output = args[i++]; int rotation = 0; if (args.Length >= i + 1) { rotation = System.Convert.ToInt32(args[i++]); } int mode = 0; if (args.Length >= i + 1) { mode = System.Convert.ToInt32(args[i++]); } int[] chunkCoords = new int[6]; for (int pos = 0; pos < 6; pos++) { if (args.Length < i + 1) { break; } chunkCoords[pos] = System.Convert.ToInt32(args[i++]); } try { Map map = fCraft.MapConversion.MapUtility.Load(filename); map.CalculateShadows(); fCraft.GUI.IsoCat renderer = new fCraft.GUI.IsoCat(map, (fCraft.GUI.IsoCatMode)mode, rotation); renderer.ChunkCoords = chunkCoords; Rectangle cropRectangle; BackgroundWorker bwRenderer = new BackgroundWorker(); bwRenderer.WorkerReportsProgress = true; Bitmap rawImage = renderer.Draw(out cropRectangle, bwRenderer); Bitmap outputImage = rawImage.Clone(cropRectangle, rawImage.PixelFormat); outputImage.Save(output, System.Drawing.Imaging.ImageFormat.Png); } catch (Exception ex) { Console.WriteLine("An Error Occured!"); Console.Write(ex); } }
void RenderLoop() { renderer = MakeRenderer(); using( MemoryStream ms = new MemoryStream() ) { // loop terminates with the rest of the program (this is a background thread) while( true ) { // wait (block) until a map is available for drawing RenderTask task = inQueue.WaitDequeue(); try { // render the map IsoCatResult result = renderer.Draw( task.Map ); task.Map = null; // crop image (if needed) Image image; if( p.Uncropped ) { image = result.Bitmap; } else { image = result.Bitmap.Clone( result.CropRectangle, result.Bitmap.PixelFormat ); result.Bitmap.Dispose(); } // encode image if( p.ExportFormat.Equals( ImageFormat.Jpeg ) ) { EncoderParameters encoderParams = new EncoderParameters(); encoderParams.Param[0] = new EncoderParameter( Encoder.Quality, p.JpegQuality ); image.Save( ms, p.ImageEncoder, encoderParams ); } else if( p.ExportFormat.Equals( ImageFormat.Gif ) ) { OctreeQuantizer q = new OctreeQuantizer( 255, 8 ); image = q.Quantize( image ); image.Save( ms, p.ExportFormat ); } else { image.Save( ms, p.ExportFormat ); } image.Dispose(); // store result as a byte[] task.Result = ms.ToArray(); } catch( Exception ex ) { task.Exception = ex; } // send stack to the results queue outQueue.Enqueue( task ); ms.SetLength( 0 ); } } }
void AsyncDraw( object sender, DoWorkEventArgs e ) { stopwatch = Stopwatch.StartNew(); renderer = new IsoCat( Map, IsoCatMode.Normal, previewRotation ); Rectangle cropRectangle; if( bwRenderer.CancellationPending ) return; Bitmap rawImage = renderer.Draw( out cropRectangle, bwRenderer ); if( bwRenderer.CancellationPending ) return; if( rawImage != null ) { previewImage = rawImage.Clone( cropRectangle, rawImage.PixelFormat ); } renderer = null; GC.Collect( GC.MaxGeneration, GCCollectionMode.Optimized ); }