private static long CalculateWhitePixel(Slices.Slice slice) { var amountOfWhitePixels = RenderEngineHelper.ConvertPolyTreesToPixels(pixelValues, slice.ModelPolyTrees, PrintJob.SelectedPrinter.ProjectorResolutionX, PrintJob.SelectedPrinter.ProjectorResolutionY, true); amountOfWhitePixels += RenderEngineHelper.ConvertPolyTreesToPixels(pixelValues, slice.SupportPolyTrees, PrintJob.SelectedPrinter.ProjectorResolutionX, PrintJob.SelectedPrinter.ProjectorResolutionY, false); TotatAmountofActivePixel = TotatAmountofActivePixel + amountOfWhitePixels; return(TotatAmountofActivePixel); }
private static bool RenderSliceToPNG(Slices.Slice slice) { var result = false; //create pic object Bitmap t = null; lock (_renderBitmap) { t = (Bitmap)_renderBitmap.Clone(); } lock (pixelValues) { var pixelLength = pixelValues.Length; Array.Clear(pixelValues, 0, pixelLength); Array.Clear(pixelBleedingValues, 0, pixelLength); //render model points var amountOfWhitePixels = CalculateWhitePixel(slice); //render bleeding points if (PrintJob.Material.BleedingOffset > 0 && slice.SliceIndex > 5) { if (slice.ModelBleedingPolyTrees != null && slice.ModelBleedingPolyTrees.Length > 0) { RenderEngineHelper.ConvertPolyTreesToPixels(pixelBleedingValues, slice.ModelBleedingPolyTrees, PrintJob.SelectedPrinter.ProjectorResolutionX, PrintJob.SelectedPrinter.ProjectorResolutionY, true); var emptyBleedingModelPolyTrees = new List <PolyTree> [slice.ModelBleedingPolyTrees.Length]; for (var modelBleedingPolyTreeIndex = 0; modelBleedingPolyTreeIndex < slice.ModelBleedingPolyTrees.Length; modelBleedingPolyTreeIndex++) { if (slice.ModelBleedingPolyTrees[modelBleedingPolyTreeIndex] == null) { //process no bleeding information available emptyBleedingModelPolyTrees[modelBleedingPolyTreeIndex] = slice.ModelPolyTrees[modelBleedingPolyTreeIndex]; } } //convert empty polygons to bleeding pixels RenderEngineHelper.ConvertPolyTreesToPixels(pixelBleedingValues, emptyBleedingModelPolyTrees, PrintJob.SelectedPrinter.ProjectorResolutionX, PrintJob.SelectedPrinter.ProjectorResolutionY, true, 0); //do bleeding merge model pixel active and bleeding not active then not active for (var modelPixelIndex = 0; modelPixelIndex < pixelLength; modelPixelIndex += 3) { if (pixelValues[modelPixelIndex] == 255 && pixelBleedingValues[modelPixelIndex] == 0) { pixelValues[modelPixelIndex] = 0; pixelValues[modelPixelIndex + 1] = 0; pixelValues[modelPixelIndex + 2] = 0; amountOfWhitePixels -= 1; } } } else { amountOfWhitePixels = 0; } } //render support points if (amountOfWhitePixels > UserProfileManager.UserProfile.Settings_PrintJob_FirstSlice_MinAmountOfPixels) { result = true; } else if (amountOfWhitePixels == 0 && slice.SliceIndex > 5) { lock (_emptyPNGs) { _emptyPNGs.Add(slice.SliceIndex, 0); } } //Get a reference to the images pixel data BitmapData picData = t.LockBits(new Rectangle(0, 0, PrintJob.SelectedPrinter.ProjectorResolutionX, PrintJob.SelectedPrinter.ProjectorResolutionY), ImageLockMode.WriteOnly, t.PixelFormat); IntPtr pixelStartAddress = picData.Scan0; //Copy the pixel data into the bitmap structure System.Runtime.InteropServices.Marshal.Copy(pixelValues, 0, pixelStartAddress, pixelValues.Length); t.UnlockBits(picData); } try { if (!_emptyPNGs.ContainsKey(slice.SliceIndex)) { using (var memStream = new MemoryStream()) { // t.Save("Slices\\" + slice.SliceIndex + ".png"); t.Save(memStream, ImageFormat.Png); t.Dispose(); memStream.Position = 0; lock (_zipStream) { var entry = new ZipEntry(slice.SliceIndex + ".png"); _zipStream.PutNextEntry(entry); try { byte[] transferBuffer = new byte[1024]; int bytesRead; do { bytesRead = memStream.Read(transferBuffer, 0, transferBuffer.Length); _zipStream.Write(transferBuffer, 0, bytesRead); }while (bytesRead > 0); } finally { memStream.Close(); } _zipStream.CloseEntry(); //LoggingManager.WriteToLog("RenderSliceThread", "Zip location", _); } } } } catch (Exception exc) { LoggingManager.WriteToLog("RenderSliceThread", "Save image (exception)", exc.Message); } return(result); }