7

それはすべて、Stackoverflowで見つけた非常に便利なコードから始まりました。

次に、独自の調整を行い、このメソッドに画像のサイズ変更を追加することにしました。ただし、この問題に苦労した後、「パラメータが無効です」という情報が表示されます。

また、エラーにもかかわらず、画像が正常にアップロードされていることを強調したいと思います。ただし、意図したとおりに最適化されていません。


これは私の「アップロードボタン」のコードの一部です。

fuOne.SaveAs(Server.MapPath("~/imgFolder/temp/") + fuOne.FileName);

System.Drawing.Image imgUploaded = System.Drawing.Image.FromFile(Server.MapPath("~/imgFolder/temp/") + fuOne.FileName);

SaveJpeg(Server.MapPath("~/imgFolder/temp/") + fuOne.FileName, imgUploaded, 60, 300, 300);

これは私のSaveJpegメソッドの完全なコードです:

public static void SaveJpeg(string path, System.Drawing.Image imgUploaded, int quality, int maxWidth, int maxHeight)
    {
        if (quality < 0 || quality > 100)
            throw new ArgumentOutOfRangeException("quality must be between 0 and 100.");

        // resize the image
        int newWidth = imgUploaded.Width;
        int newHeight = imgUploaded.Height;
        double aspectRatio = (double)imgUploaded.Width / (double)imgUploaded.Height;

        if (aspectRatio <= 1 && imgUploaded.Width > maxWidth)
        {
            newWidth = maxWidth;
            newHeight = (int)Math.Round(newWidth / aspectRatio);
        }
        else if (aspectRatio > 1 && imgUploaded.Height > maxHeight)
        {
            newHeight = maxHeight;
            newWidth = (int)Math.Round(newHeight * aspectRatio);
        }


        Bitmap newImage = new Bitmap(imgUploaded, newWidth, newHeight);

        Graphics g = Graphics.FromImage(imgUploaded);
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
        g.DrawImage(imgUploaded, 0, 0, newImage.Width, newImage.Height);

        g.Dispose();
        imgUploaded.Dispose();

        // Lets start to change the image quality
        EncoderParameter qualityParam =
            new EncoderParameter(Encoder.Quality, quality);
        // Jpeg image codec 
        ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");

        EncoderParameters encoderParams = new EncoderParameters(1);
        encoderParams.Param[0] = qualityParam;

        System.Drawing.Image imgFinal = (System.Drawing.Image)newImage;
        newImage.Dispose();

        imgFinal.Save(path, jpegCodec, encoderParams);
        imgFinal.Dispose();
    }

    /// <summary> 
    /// Returns the image codec with the given mime type 
    /// </summary> 
    private static ImageCodecInfo GetEncoderInfo(string mimeType)
    {
        // Get image codecs for all image formats 
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

        // Find the correct image codec 
        for (int i = 0; i < codecs.Length; i++)
            if (codecs[i].MimeType == mimeType)
                return codecs[i];
        return null;
    } 

ファローアップ

コードにいくつかのエラーがあったようです。1つはエンコードに、もう1つは画像保存に使用されます。

Aristosのフォローアップは、この問題を解決するために非常に重要です。これは、ファイルを保存するときの私のひどい間違いを修正するためです。

4

3 に答える 3

9

画像を保存するときにより正しいことをお勧めします

ImageCodecInfo myImageCodecInfo = FindJpegEncoder();

EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, cQuality);

imgFinal.Save(TheFileNameTosaveIt, myImageCodecInfo, encoderParameters);

これは、システムからエンコーダーを見つけるための関数です

internal static ImageCodecInfo FindJpegEncoder()
{
    // find jpeg encode text
    foreach (ImageCodecInfo info in ImageCodecInfo.GetImageEncoders())
    {
        if (info.FormatID.Equals(ImageFormat.Jpeg.Guid))
        {
            return info;
        }
    }

    Debug.Fail("Fail to find jPeg Encoder!");
    return null;
}

ここで、それが長いことを確認してください。実際には、関数呼び出しで int を long にlong cQuality = 65L変更する必要があるだけだと思います。また、dispose() が必要な関数でワープすることをお勧めします。using(){}

ファローアップ

保存しようとしている NewImage にバグがあり、以前に作成した実際のグラフィックスからバグを取得できないため、何も変更されていません。あなたの実際のコードは作成イメージを保存しませんでしたが、新しいイメージを作成したので、このコード

System.Drawing.Image imgFinal = (System.Drawing.Image)newImage;
newImage.Dispose();

imgFinal.Save(path, jpegCodec, encoderParams);
imgFinal.Dispose();

でなければなりません

newImage.Save(path, jpegCodec, encoderParams);
newImage.Dispose();
于 2012-09-14T11:22:28.547 に答える
5

品質のデータ型を指定することで、この問題を修正できました。「長い」必要があるため、これで問題が解決しました。

[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
$bmp = New-Object System.Drawing.Bitmap $imagePath

#Encoder parameter for image quality 
$myEncoder = [System.Drawing.Imaging.Encoder]::Quality
$encoderParams = New-Object System.Drawing.Imaging.EncoderParameters(1) 
$encoderParams.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter($myEncoder, [long]$quality)

# get codec
$myImageCodecInfo = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders()|where {$_.MimeType -eq 'image/jpeg'}

#save to file
$bmp.Save($imageOutPut,$myImageCodecInfo, $($encoderParams))

「長い」がなければ、エラーは次のとおりです。

Exception calling "Save" with "3" argument(s): "Parameter is not valid."
At C:\Projects\Image_Comparison\ImageComparison.ps1:81 char:49
+     $bmp.Save($imageOutPut,$myImageCodecInfo, $($encoderParams))
+                                                 ~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException
于 2016-05-19T07:10:36.610 に答える
5

私の場合、Dispose以前に誤って呼び出しSaveていたため、同じ「パラメーターが無効です」というエラーが発生しました

お役に立てれば!

于 2014-12-26T20:32:07.193 に答える