How is a sepia tone created?

后端 未结 4 1036
独厮守ぢ
独厮守ぢ 2020-12-28 20:24

What are the basic operations needed to create a sepia tone? My reference point is the perl imagemagick library, so I can easily use any basic operation. I\'ve tried to quan

相关标签:
4条回答
  • 2020-12-28 20:31

    It's easy if you use the imagemagic command line.

    http://www.imagemagick.org/script/convert.php

    Use the "-sepia-tone threshold" argument when converting.

    Strangely enough, the PerlMagick API doesn't seem to include a method for doing this directly:

    http://www.imagemagick.org/script/perl-magick.php

    ...and no reference to any Sepia method.

    0 讨论(0)
  • 2020-12-28 20:38

    This is in C#, however, the basic concepts are the same. You will likely be able to convert this into perl.

      private void SepiaBitmap(Bitmap bmp)
    {
        Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
        System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
            System.Drawing.Imaging.PixelFormat.Format32bppRgb);
    
        IntPtr ptr = bmpData.Scan0;
    
        int numPixels = bmpData.Width * bmp.Height;
        int numBytes = numPixels * 4;
        byte[] rgbValues = new byte[numBytes];
    
        System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, numBytes);
        for (int i = 0; i < rgbValues.Length; i += 4)
        {
            rgbValues[i + 2] = (byte)Math.Min((.393 * red) + (.769 * green) + (.189 * (blue)), 255.0); //red
            rgbValues[i + 1] = (byte)Math.Min((.349 * red) + (.686 * green) + (.168 * (blue)), 255.0); //green
            rgbValues[i + 0] = (byte)Math.Min((.272 * red) + (.534 * green) + (.131 * (blue)), 255.0); //blue
            if ((rgbValues[i + 2]) > 255)
            {
                rgbValues[i + 2] = 255; 
            }
    
            if ((rgbValues[i + 1]) > 255)
            {
                rgbValues[i + 1] = 255;
            }
            if ((rgbValues[i + 0]) > 255)
            {
                rgbValues[i + 0] = 255;
            }
        }
    
        System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, numBytes);
        this.Invalidate();
        bmp.UnlockBits(bmpData);
    
    }
    
    0 讨论(0)
  • 2020-12-28 20:41

    Take a look at how it's implemented in the AForge.NET library, the C# code is here.

    The basics seem to be

    • transform it to the YIQ color space
    • modify it
    • transform back to RGB

    The full alrogithm is in the source code, plus the RGB -> YIQ and YIQ -> RGB transformations are explained.

    0 讨论(0)
  • 2020-12-28 20:45

    Sample code of a sepia converter in C# is available in my answer here: What is wrong with this sepia tone conversion algorithm?

    The algorithm comes from this page, each input pixel color is transformed in the following way:

    outputRed = (inputRed * .393) + (inputGreen *.769) + (inputBlue * .189)
    outputGreen = (inputRed * .349) + (inputGreen *.686) + (inputBlue * .168)
    outputBlue = (inputRed * .272) + (inputGreen *.534) + (inputBlue * .131)
    

    If any of these output values is greater than 255, you simply set it to 255. These specific values are the values for sepia tone that are recommended by Microsoft.

    0 讨论(0)
提交回复
热议问题