Image Downsizer

Let’s say you have images that you wish to load into your application. However, instead of having the user downscale or downsize those images first, your application could do it for them.

Below is a piece of code I wrote in C# that will do just that by brute forcing. Admittedly, it’s not the best solution. An AI probably could do it better but in many cases, the following works pretty well.

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace ImageTuner
{
    class Program
    {
        static void Main(string[] args)
        {
            string originalImageFile = "<image image file&gt;.jpg";
            string scaledImageFile = "<downsized image file&gt;.jpg";
            bool imageMatchCriterion = false;
            bool imageStillTooBig = false;

            float resolutionScaleFactor = 0.95f;
            long jpegQualityLevel = 100L;

            using (var originalImage = new Bitmap(originalImageFile))
            {
                while (!imageMatchCriterion)
                {
                    Console.WriteLine("Image doesn't match size criterion. Resizing.");
                    int scaledHeight = (int)(originalImage.Height * resolutionScaleFactor);
                    int scaledWidth = (int)(originalImage.Width * resolutionScaleFactor);

                    using (var toCompress = new Bitmap(originalImage, new Size(height: scaledHeight, width: scaledWidth)))
                    {
                        var jpgEncoder = GetEncoder(ImageFormat.Jpeg);
                        var myEncoder = Encoder.Quality;
                        var myEncoderParameters = new EncoderParameters(1);

                        var myEncoderParameter = new EncoderParameter(myEncoder, jpegQualityLevel);
                        myEncoderParameters.Param[0] = myEncoderParameter;

                        using (var tempStream = new MemoryStream())
                        {
                            //Save the image byte to memory first.
                            toCompress.Save(tempStream, jpgEncoder, myEncoderParameters);
                            byte[] imageSize = tempStream.ToArray();
                            //Check the image size in memory. If it's too big, continue to loop.
                            if (imageSize.Length <= 512000)
                            {
                                imageMatchCriterion = true;
                                using (var saveStream = new FileStream(scaledImageFile, FileMode.Create))
                                {
                                    toCompress.Save(saveStream, jpgEncoder, myEncoderParameters);
                                }
                            }
                            else
                            {
                                if (resolutionScaleFactor &gt; 0.60f)
                                {
                                    //Reduce the resolution of the image by 10 percent each time.
                                    resolutionScaleFactor -= 0.10f;
                                }
                                else
                                {
                                    //When the resolution scaling already reach 60%, time to look at reducing the quality level by 5 each time.
                                    if (jpegQualityLevel &gt; 50)
                                    {
                                        jpegQualityLevel -= 5L;
                                    }
                                    else
                                    {
                                        //Cannot drop the image quality below 50 percent. Once that happen, the image is almost unusable.
                                        imageStillTooBig = true;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (imageStillTooBig)
            {
                Console.WriteLine("Image resizing failed.");
            }
            else
            {
                Console.WriteLine("Image resizing completed.");
            }
            

        }

        private static ImageCodecInfo GetEncoder(ImageFormat format)
        {
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
            foreach (ImageCodecInfo codec in codecs)
            {
                if (codec.FormatID == format.Guid)
                {
                    return codec;
                }
            }
            return null;
        }
    }
}


Focus and specialise

Conventional wisdom dictates that there are two main types of people in this world: Those who are specialists and those who are generalists.

But do you accept that wisdom is the truth?

For me, I don’t accept that wisdom.

It’s because, we also forget there’s the third type of person. The polymath. The Leonardo da Vinci of the world.

These are people who are really good at multiple fields or industry that to most people they are no different from specialists from specific field or industry.

Now, some people will just say that a polymath is really just someone who’s the best version of a generalists. However, the truth is polymaths are not generalists. They are specialists who figured out how to take what they are truly good at to apply at other fields or industry as described by Sean Norton in his article titled Polymaths aren’t generalists.

And the sad truth is that being either a specialist or a generalist isn’t good enough anymore for the global economy we have today. We all have to polymaths in order to participate in the economy in any truly meaningful way and earn our keep.

The reason why I said that is because of what I experienced during my job search.

Although I have at least five years of software development experience with a collection of other experiences I acquired over the years, they aren’t enough for me to get into the doors of certain companies like Grab, Lazada, PayPal or even Google. At the same time, I’m unable to go with a smaller and older companies, especially those SMEs in Singapore because they are unable to pay the kind of money that I believe I’m worth. If you are wondering, on average, a software engineer with my years of experience can command at least SG$4800 per month, excluding bonuses. Most SME can’t afford that. And so they will either hire someone who just need a job or more junior. Worse case, the role will be vacant for months because they just couldn’t find the right person.

So my conclusion is, to be a truly good software engineer who can command a high salary and respect from your peers, you have to really devote a large portion of your time to practice and play with technology. Because, you are to have a good grasp of algorithms, mathematics, software design patterns, software architecture, be fast, rational and logical, understand user needs and requirement, know about the different databases, and have working experience with a bunch of programming languages under your belt. A polygot, if you will. You also have to know how to write properly to prepare the necessary documentations. Furthermore, you have to know how to properly manage your time, communicate well with your colleagues and the various stakeholders. Finally, you have to know how to sell or market either your idea, yourself or both. Oh, don’t forget, you might also need to provide support to users…

What if you aren’t that good or don’t want to be that good due to a variety of personal reasons.

You are left with companies that are neither here or there. You still can get a decent pay writing code and managing projects but don’t expect yourself to be doing “change the world” type of projects. Before long you will be replaced by younger generation of software engineers who are probably smarter, faster, more nimble and flexible. I’ve seen first hand just how good the younger codes are. And who knows. Maybe replaced by an artificial intelligence (AI).

Don’t get me wrong. There’s nothing wrong with going to tech companies that are neither here or there. Maybe they can offer better working conditions. Maybe they are much slower in terms of pace. Less over time. The thing is, these companies are still around because they still can deliver a certain kind of value to their customers. In that context, for a person who’s married, have kids and a variety of commitments, your priority will be very different from someone and that might be a good fit. But for someone who’s single and still want to make an impact with what he or she does, those kind of companies might not be suitable.

But of course, don’t forget about self-awareness. You have to know who you are truly and whether you are a good fit in those startups or big tech like Amazon, Facebook, or Google. If you know you are not, then you better find alternatives that are more inline with what you look for and take actions to go that path.

For me, I know why I’m not there at the top. It’s nobody’s fault. I made the decision to split my time into doing a variety of other stuff that don’t really have any relationship to software development.

I devoted time and energy into writing that went relatively well for me for a time. Then the motivation just died and my writing enters into mediocre, barely any content state that you see now. You don’t even see me log in to Medium or WordPress that often these days. Neither do I even think much about writing. I let my writing projects sit and idle. I devote time and energy into video games and TV shows. Furthermore, in terms of the programming languages and technology stacks that I use to build software, I’m all over the place. Even my job role changed from developer to consultant-like and back to developer. I don’t even know how to market myself to job agents and hiring managers. Hell, I don’t even know what I like anymore.

So the lesson here is that one have to focus and be a specialist in whatever they do. Because ultimately, even polymaths are specialists. Don’t be a generalist because it will lead you to nowhere nice. After you have mastered all that you could possibly master in a given field, take the skillsets you’ve acquired to master the field and apply it into another field.

For example, as a programmer, I know I care deeply about formatting, style and highly readable yet expressive codes. So I have to keep practicising until I can do it without betting an eye just so that I can apply those techniques in writing with ease. Furthermore, if I focus on mastering a specific technology stack and framework, I could expand out into mentoring people using that specific stack. Now that will allow me to grow in a different way. Maybe, grow to become someone who can teach and communicate well. Even better, write highly detailed contents about the technology stack I use to help other people. And that could be the start of the journey to become a polymath.