3

画像に透かしを追加して最高の品質で保存しようとしていますが、JPEGの透かしを保存すると品質が低下します(ただし、メイン画像の品質は良好です)。

string wtrSrc = @"D:\watermark.png";
string imgSrc = @"D:\image.jpg";
string imgOutJPG = @"D:\result.jpg";          
string imgOutPNG = @"D:\result.png";

// create new image
Bitmap imgOutput = new Bitmap(imgSrc);
Graphics outputGraphics = Graphics.FromImage(imgOutput);

// image quality
outputGraphics.CompositingQuality = CompositingQuality.HighQuality;
outputGraphics.InterpolationMode = InterpolationMode.HighQualityBilinear;
outputGraphics.SmoothingMode = SmoothingMode.HighQuality;
outputGraphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

// create watermark image
System.Drawing.Image wtrmark = System.Drawing.Image.FromFile(wtrSrc);        

// add waternark
float wtrmarkX = 10;
float wtrmarkY = 10;
outputGraphics.DrawImage(wtrmark, wtrmarkX, wtrmarkY);

//set jpeg quality    
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
myEncoderParameters.Param[0] = myEncoderParameter;

// save result
imgOutput.Save(imgOutJPG, GetEncoder(ImageFormat.Jpeg), myEncoderParameters);
imgOutput.Save(imgOutPNG, ImageFormat.Png);

// clean
wtrmark.Dispose();
imgOutput.Dispose();
outputGraphics.Dispose();

……

    // ImageCodecInfo 
    private ImageCodecInfo GetEncoder(ImageFormat format)
    {

        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                return codec;
            }
        }
        return null;
    }

PNG 保存はうまく機能しますが、JPEG を保存する必要があります。PNG と JPEG の違いは次の とおりです http://i.stack.imgur.com/CqwgZ.jpg

私はこの記事http://www.codeproject.com/Articles/2927/Creating-a-Watermarked-Photograph-with-GDI-for-NETに従い、同じ結果を得ました。

JPEGの透かしの見栄えを良くする方法はありますか?

4

1 に答える 1