Browse Source

Merge pull request #396 from Greenliff/feature/donotclosestream

#395 fix

Former-commit-id: 8fd3e2b25ba11bc10a8a96b9a16345c317603619
Former-commit-id: d74a772fb16b947caa6635d59f3bf6d5919e49f0
Former-commit-id: d713e673fbfdcee2aa43cc98cd2fef36fb4546a2
af/merge-core
James Jackson-South 10 years ago
parent
commit
033a190f6b
  1. 53
      src/ImageProcessorCore/Formats/Bmp/BmpEncoderCore.cs
  2. 63
      src/ImageProcessorCore/Formats/Gif/GifEncoderCore.cs

53
src/ImageProcessorCore/Formats/Bmp/BmpEncoderCore.cs

@ -42,35 +42,34 @@ namespace ImageProcessorCore.Formats
rowWidth += 4 - amount; rowWidth += 4 - amount;
} }
using (EndianBinaryWriter writer = new EndianBinaryWriter(EndianBitConverter.Little, stream)) EndianBinaryWriter writer = new EndianBinaryWriter(EndianBitConverter.Little, stream);
{
int bpp = (int)this.bmpBitsPerPixel;
BmpFileHeader fileHeader = new BmpFileHeader int bpp = (int)this.bmpBitsPerPixel;
{
Type = 19778, // BM
Offset = 54,
FileSize = 54 + (image.Height * rowWidth * bpp)
};
BmpInfoHeader infoHeader = new BmpInfoHeader BmpFileHeader fileHeader = new BmpFileHeader
{ {
HeaderSize = 40, Type = 19778, // BM
Height = image.Height, Offset = 54,
Width = image.Width, FileSize = 54 + (image.Height * rowWidth * bpp)
BitsPerPixel = (short)(8 * bpp), };
Planes = 1,
ImageSize = image.Height * rowWidth * bpp, BmpInfoHeader infoHeader = new BmpInfoHeader
ClrUsed = 0, {
ClrImportant = 0 HeaderSize = 40,
}; Height = image.Height,
Width = image.Width,
WriteHeader(writer, fileHeader); BitsPerPixel = (short)(8 * bpp),
this.WriteInfo(writer, infoHeader); Planes = 1,
this.WriteImage(writer, image); ImageSize = image.Height * rowWidth * bpp,
ClrUsed = 0,
writer.Flush(); ClrImportant = 0
} };
WriteHeader(writer, fileHeader);
this.WriteInfo(writer, infoHeader);
this.WriteImage(writer, image);
writer.Flush();
} }
/// <summary> /// <summary>

63
src/ImageProcessorCore/Formats/Gif/GifEncoderCore.cs

@ -56,47 +56,46 @@ namespace ImageProcessorCore.Formats
this.Quantizer = new OctreeQuantizer { Threshold = this.Threshold }; this.Quantizer = new OctreeQuantizer { Threshold = this.Threshold };
} }
using (EndianBinaryWriter writer = new EndianBinaryWriter(EndianBitConverter.Little, stream)) EndianBinaryWriter writer = new EndianBinaryWriter(EndianBitConverter.Little, stream);
{
// Ensure that quality can be set but has a fallback. // Ensure that quality can be set but has a fallback.
int quality = this.Quality > 0 ? this.Quality : imageBase.Quality; int quality = this.Quality > 0 ? this.Quality : imageBase.Quality;
this.Quality = quality > 0 ? quality.Clamp(1, 256) : 256; this.Quality = quality > 0 ? quality.Clamp(1, 256) : 256;
// Get the number of bits. // Get the number of bits.
this.bitDepth = ImageMaths.GetBitsNeededForColorDepth(this.Quality); this.bitDepth = ImageMaths.GetBitsNeededForColorDepth(this.Quality);
// Quantize the image returning a palette. // Quantize the image returning a palette.
QuantizedImage quantized = this.Quantizer.Quantize(image, this.Quality); QuantizedImage quantized = this.Quantizer.Quantize(image, this.Quality);
// Write the header. // Write the header.
this.WriteHeader(writer); this.WriteHeader(writer);
// Write the LSD. We'll use local color tables for now. // Write the LSD. We'll use local color tables for now.
this.WriteLogicalScreenDescriptor(image, writer, quantized.TransparentIndex); this.WriteLogicalScreenDescriptor(image, writer, quantized.TransparentIndex);
// Write the first frame. // Write the first frame.
this.WriteGraphicalControlExtension(imageBase, writer, quantized.TransparentIndex); this.WriteGraphicalControlExtension(imageBase, writer, quantized.TransparentIndex);
this.WriteImageDescriptor(image, writer); this.WriteImageDescriptor(image, writer);
this.WriteColorTable(quantized, writer); this.WriteColorTable(quantized, writer);
this.WriteImageData(quantized, writer); this.WriteImageData(quantized, writer);
// Write additional frames. // Write additional frames.
if (image.Frames.Any()) if (image.Frames.Any())
{
this.WriteApplicationExtension(writer, image.RepeatCount, image.Frames.Count);
foreach (ImageFrame frame in image.Frames)
{ {
this.WriteApplicationExtension(writer, image.RepeatCount, image.Frames.Count); QuantizedImage quantizedFrame = this.Quantizer.Quantize(frame, this.Quality);
foreach (ImageFrame frame in image.Frames) this.WriteGraphicalControlExtension(frame, writer, quantizedFrame.TransparentIndex);
{ this.WriteImageDescriptor(frame, writer);
QuantizedImage quantizedFrame = this.Quantizer.Quantize(frame, this.Quality); this.WriteColorTable(quantizedFrame, writer);
this.WriteGraphicalControlExtension(frame, writer, quantizedFrame.TransparentIndex); this.WriteImageData(quantizedFrame, writer);
this.WriteImageDescriptor(frame, writer);
this.WriteColorTable(quantizedFrame, writer);
this.WriteImageData(quantizedFrame, writer);
}
} }
// TODO: Write Comments extension etc
writer.Write(GifConstants.EndIntroducer);
} }
// TODO: Write Comments extension etc
writer.Write(GifConstants.EndIntroducer);
} }
/// <summary> /// <summary>

Loading…
Cancel
Save