Note that there are some explanatory texts on larger screens.

plurals
  1. POField xxx is never assigned to, and will always have its default value null
    text
    copied!<p>Anyone know whats this problem? </p> <p>I got this warning <strong>Field xxx is never assigned to, and will always have its default value null</strong> on <code>private static Quantizer <strong>quantit</strong>;</code></p> <p>I dont know what to do to fix, cause when I try to use <code>quantit.Quantize()</code> debug says: <strong>"Object reference not set to an instance of an object."</strong> and point to <code>au = quantit.Quantize();</code></p> <p>The code:</p> <pre><code>public class Quantization : System.Windows.Forms.Form { private static Quantizer quantit; private Button btnLoad; private PictureBox imgPhoto; public Quantization() { btnLoad = new Button(); btnLoad.Text = "&amp;Load"; btnLoad.Left = 10; btnLoad.Top = 10; btnLoad.Click += new System.EventHandler(this.OnLoadClick); imgPhoto = new PictureBox(); imgPhoto.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; imgPhoto.Width = this.Width / 2; imgPhoto.Height = this.Height / 2; imgPhoto.Left = (this.Width - imgPhoto.Width) / 2; imgPhoto.Top = (this.Height - imgPhoto.Height) / 2; imgPhoto.SizeMode = PictureBoxSizeMode.StretchImage; this.Controls.Add(btnLoad); this.Controls.Add(imgPhoto); } protected void OnLoadClick(object sender, System.EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Title = "Open Image"; dlg.Filter = "jpg files (*.jpg)|*.jpg|All files (*.*)|*.*" ; if (dlg.ShowDialog() == DialogResult.OK) { Bitmap au; //Image bmp = Image.FromFile("D:\\Documents and Settings\\kiosk.suprisul\\My Documents\\foto1.jpg"); au = quantit.Quantize(); imgPhoto.Image = au; //imgPhoto.Image = bmp; //imgPhoto.Image = au; //new Bitmap(dlg.OpenFile()); } dlg.Dispose(); } [STAThread] static void Main(string[] args) { //Image bmp; //bmp = Image.FromFile("teste.jpg"); //PaintEventArgs e; //teste2.Quantize(bmp); Application.Run(new Quantization()); /* System.Console.WriteLine("Hello, World!"); System.Console.ReadLine();*/ } } </code></pre> <p>The class:</p> <pre><code>namespace ImageManipulation { public unsafe abstract class Quantizer { /// &lt;summary&gt; /// Construct the quantizer /// &lt;/summary&gt; /// &lt;param name="singlePass"&gt;If true, the quantization only needs to loop through the source pixels once&lt;/param&gt; /// &lt;remarks&gt; /// If you construct this class with a true value for singlePass, then the code will, when quantizing your image, /// only call the 'QuantizeImage' function. If two passes are required, the code will call 'InitialQuantizeImage' /// and then 'QuantizeImage'. /// &lt;/remarks&gt; public Quantizer(bool singlePass) { _singlePass = singlePass; } /// &lt;summary&gt; /// Quantize an image and return the resulting output bitmap /// &lt;/summary&gt; /// &lt;param name="source"&gt;The image to quantize&lt;/param&gt; /// &lt;returns&gt;A quantized version of the image&lt;/returns&gt; public Bitmap Quantize()//Image source) { Image source = Image.FromFile("C:\\Users\\crashboy\\Downloads\\image009.jpg"); // Get the size of the source image int height = source.Height; int width = source.Width; // And construct a rectangle from these dimensions Rectangle bounds = new Rectangle(0, 0, width, height); // First off take a 32bpp copy of the image Bitmap copy = new Bitmap(width, height, PixelFormat.Format32bppArgb); // And construct an 8bpp version Bitmap output = new Bitmap(width, height, PixelFormat.Format8bppIndexed); // Now lock the bitmap into memory using (Graphics g = Graphics.FromImage(copy)) { g.PageUnit = GraphicsUnit.Pixel; // Draw the source image onto the copy bitmap, // which will effect a widening as appropriate. g.DrawImage(source, bounds); } // Define a pointer to the bitmap data BitmapData sourceData = null; try { // Get the source image bits and lock into memory sourceData = copy.LockBits(bounds, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); // Call the FirstPass function if not a single pass algorithm. // For something like an octree quantizer, this will run through // all image pixels, build a data structure, and create a palette. if (!_singlePass) FirstPass(sourceData, width, height); // Then set the color palette on the output bitmap. I'm passing in the current palette // as there's no way to construct a new, empty palette. output.Palette = this.GetPalette(output.Palette); // Then call the second pass which actually does the conversion SecondPass(sourceData, output, width, height, bounds); } finally { // Ensure that the bits are unlocked copy.UnlockBits(sourceData); } // Last but not least, return the output bitmap return output; } /// &lt;summary&gt; /// Execute the first pass through the pixels in the image /// &lt;/summary&gt; /// &lt;param name="sourceData"&gt;The source data&lt;/param&gt; /// &lt;param name="width"&gt;The width in pixels of the image&lt;/param&gt; /// &lt;param name="height"&gt;The height in pixels of the image&lt;/param&gt; protected virtual void FirstPass(BitmapData sourceData, int width, int height) { // Define the source data pointers. The source row is a byte to // keep addition of the stride value easier (as this is in bytes) byte* pSourceRow = (byte*)sourceData.Scan0.ToPointer(); Int32* pSourcePixel; // Loop through each row for (int row = 0; row &lt; height; row++) { // Set the source pixel to the first pixel in this row pSourcePixel = (Int32*)pSourceRow; // And loop through each column for (int col = 0; col &lt; width; col++, pSourcePixel++) // Now I have the pixel, call the FirstPassQuantize function... InitialQuantizePixel((Color32*)pSourcePixel); // Add the stride to the source row pSourceRow += sourceData.Stride; } } /// &lt;summary&gt; /// Execute a second pass through the bitmap /// &lt;/summary&gt; /// &lt;param name="sourceData"&gt;The source bitmap, locked into memory&lt;/param&gt; /// &lt;param name="output"&gt;The output bitmap&lt;/param&gt; /// &lt;param name="width"&gt;The width in pixels of the image&lt;/param&gt; /// &lt;param name="height"&gt;The height in pixels of the image&lt;/param&gt; /// &lt;param name="bounds"&gt;The bounding rectangle&lt;/param&gt; protected virtual void SecondPass(BitmapData sourceData, Bitmap output, int width, int height, Rectangle bounds) { BitmapData outputData = null; try { // Lock the output bitmap into memory outputData = output.LockBits(bounds, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); // Define the source data pointers. The source row is a byte to // keep addition of the stride value easier (as this is in bytes) byte* pSourceRow = (byte*)sourceData.Scan0.ToPointer(); Int32* pSourcePixel = (Int32*)pSourceRow; Int32* pPreviousPixel = pSourcePixel; // Now define the destination data pointers byte* pDestinationRow = (byte*)outputData.Scan0.ToPointer(); byte* pDestinationPixel = pDestinationRow; // And convert the first pixel, so that I have values going into the loop byte pixelValue = QuantizePixel((Color32*)pSourcePixel); // Assign the value of the first pixel *pDestinationPixel = pixelValue; // Loop through each row for (int row = 0; row &lt; height; row++) { // Set the source pixel to the first pixel in this row pSourcePixel = (Int32*)pSourceRow; // And set the destination pixel pointer to the first pixel in the row pDestinationPixel = pDestinationRow; // Loop through each pixel on this scan line for (int col = 0; col &lt; width; col++, pSourcePixel++, pDestinationPixel++) { // Check if this is the same as the last pixel. If so use that value // rather than calculating it again. This is an inexpensive optimisation. if (*pPreviousPixel != *pSourcePixel) { // Quantize the pixel pixelValue = QuantizePixel((Color32*)pSourcePixel); // And setup the previous pointer pPreviousPixel = pSourcePixel; } // And set the pixel in the output *pDestinationPixel = pixelValue; } // Add the stride to the source row pSourceRow += sourceData.Stride; // And to the destination row pDestinationRow += outputData.Stride; } } finally { // Ensure that I unlock the output bits output.UnlockBits(outputData); } } /// &lt;summary&gt; /// Override this to process the pixel in the first pass of the algorithm /// &lt;/summary&gt; /// &lt;param name="pixel"&gt;The pixel to quantize&lt;/param&gt; /// &lt;remarks&gt; /// This function need only be overridden if your quantize algorithm needs two passes, /// such as an Octree quantizer. /// &lt;/remarks&gt; protected virtual void InitialQuantizePixel(Color32* pixel) { } /// &lt;summary&gt; /// Override this to process the pixel in the second pass of the algorithm /// &lt;/summary&gt; /// &lt;param name="pixel"&gt;The pixel to quantize&lt;/param&gt; /// &lt;returns&gt;The quantized value&lt;/returns&gt; protected abstract byte QuantizePixel(Color32* pixel); /// &lt;summary&gt; /// Retrieve the palette for the quantized image /// &lt;/summary&gt; /// &lt;param name="original"&gt;Any old palette, this is overrwritten&lt;/param&gt; /// &lt;returns&gt;The new color palette&lt;/returns&gt; protected abstract ColorPalette GetPalette(ColorPalette original); /// &lt;summary&gt; /// Flag used to indicate whether a single pass or two passes are needed for quantization. /// &lt;/summary&gt; private bool _singlePass; /// &lt;summary&gt; /// Struct that defines a 32 bpp colour /// &lt;/summary&gt; /// &lt;remarks&gt; /// This struct is used to read data from a 32 bits per pixel image /// in memory, and is ordered in this manner as this is the way that /// the data is layed out in memory /// &lt;/remarks&gt; [StructLayout(LayoutKind.Explicit)] public struct Color32 { /// &lt;summary&gt; /// Holds the blue component of the colour /// &lt;/summary&gt; [FieldOffset(0)] public byte Blue; /// &lt;summary&gt; /// Holds the green component of the colour /// &lt;/summary&gt; [FieldOffset(1)] public byte Green; /// &lt;summary&gt; /// Holds the red component of the colour /// &lt;/summary&gt; [FieldOffset(2)] public byte Red; /// &lt;summary&gt; /// Holds the alpha component of the colour /// &lt;/summary&gt; [FieldOffset(3)] public byte Alpha; /// &lt;summary&gt; /// Permits the color32 to be treated as an int32 /// &lt;/summary&gt; [FieldOffset(0)] public int ARGB; /// &lt;summary&gt; /// Return the color for this Color32 object /// &lt;/summary&gt; public Color Color { get { return Color.FromArgb(Alpha, Red, Green, Blue); } } } } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload