2009-06-29 9 views
7

セピア調を作成するために必要な基本操作は何ですか?私のリファレンスポイントは、perl imagemagickライブラリです。私は簡単に基本操作を使用できます。私は量子化(グレースケールにする)、カラー化、そしてイメージを強調しようとしましたが、まだ少しぼやけています。セピア調はどのように作られていますか?

答えて

1

imagemagicコマンドラインを使用すると簡単です。

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

変換する際に、 "-sepiaトーンしきい値" 引数を使用します。

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

を...と任意のセピアメソッドへの参照:

不思議なことに、PerlMagickのAPIは、直接これを行うための方法を含めていないようです。

+0

私はperlでImageMagickのオブジェクトを持っているので、これは最も直接的な方法はありませんが、それは仕事ができる...しかし、効果 – user83358

1

AForge.NETライブラリでどのように実装されているかを見てください.C#コードはhereです。

基本は

  • RGB
  • フルalrogithmは、ソースコード内で、プラスに戻って変換、それを修正する

    • は、YIQ色空間への変換であるように見えますRGB→YIQとYIQ→RGB変換について説明します。 C#でセピアコンバータの

    +0

    のコードのリンクを他の色を使用するオプションを持っていないようですもう動作しません... =( –

    +0

    誰かがリンクを更新することができますか? – codejammer

    +1

    @codejammer http://bit.ly/ZP0Y3x –

    20

    サンプルコードここで私の答えで入手可能である:アルゴリズムはthis pageから来るWhat is wrong with this sepia tone conversion algorithm?

    、各入力画素色は、次のように変換される:

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

    これらの出力値のいずれかが255より大きい場合は、 を255に設定するだけです。これらの特定の値は、Microsoftが推奨する のセピアトーンの値です。

    +0

    あなたはMath.Minを使用する必要があります。私はこれらの3行の後に255のチェックを行いました。エラーが発生します。私は私のプログラムのセピア調を作ろうとしていた今日、同じ問題に直面していました... – BigBug

    +0

    しかし、もし私が何か違うものを欲しいのであればこれらの値を取得するにはどうすればいいですか?私の質問のように、私たちはこれらの値を知るようになったのです。何度も何度も何度も値を入れなければならないのでしょうか? – AHF

    3

    これはC#ですが、基本的な概念は同じです。おそらくこれを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

    数学を使う点は何ですか?minを使用してifを使用して、255が大きいかどうかを確認します。 – AndreaBogazzi

    +0

    計算された値をバイト範囲にクランプするには 'Math.Min'が必要です。それに続く 'if'ステートメントは完全に無意味です。 'rgbValues'は' byte'配列なので、その値のどれも> 255 – saucecontrol

    関連する問題