Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net .Net图像裁剪导致文件比原始文件大得多_Asp.net_.net_Vb.net_Image Processing_Jpeg - Fatal编程技术网

Asp.net .Net图像裁剪导致文件比原始文件大得多

Asp.net .Net图像裁剪导致文件比原始文件大得多,asp.net,.net,vb.net,image-processing,jpeg,Asp.net,.net,Vb.net,Image Processing,Jpeg,我正在使用以下代码来裁剪图像: Dim oImg As System.Drawing.Image = System.Drawing.Image.FromFile(sSrc) 'prep new image Dim oCanvas As System.Drawing.Bitmap Select Case oImg.PixelFormat Case 198659, 197634, 196865, 65536 'indexed formats (as found in gifs) cant

我正在使用以下代码来裁剪图像:

Dim oImg As System.Drawing.Image = System.Drawing.Image.FromFile(sSrc)

'prep new image
Dim oCanvas As System.Drawing.Bitmap
Select Case oImg.PixelFormat
    Case 198659, 197634, 196865, 65536 'indexed formats (as found in gifs) cant be used to make a graphic object
        oCanvas = New System.Drawing.Bitmap(w, h, PixelFormat.Format32bppArgb)
    Case Else 'use src img's pixel format
        oCanvas = New System.Drawing.Bitmap(w, h, oImg.PixelFormat)             
End Select
oCanvas.MakeTransparent()


Dim oGraphic As Graphics = Graphics.FromImage(oCanvas)
oGraphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
oGraphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
oGraphic.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality
oGraphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality
oGraphic.Clear(Color.Transparent)
oGraphic.DrawImage(oImg, New Rectangle(0, 0, w, h), X, Y, w, h, GraphicsUnit.Pixel)


Select Case sTgtFileExt
    Case "jpg"
        Dim jpgEncoder As ImageCodecInfo = GetEncoder(ImageFormat.Jpeg)
        Dim myEncoder As System.Drawing.Imaging.Encoder = System.Drawing.Imaging.Encoder.Quality
        Dim myEncoderParams As New EncoderParameters(1)
        Dim myEncoderQuality As New EncoderParameter(myEncoder, CType(98L, Int32)) '98%
        myEncoderParams.Param(0) = myEncoderQuality
        oCanvas.Save(sTgt, jpgEncoder, myEncoderParams)
    Case "png", "gif"
        oCanvas.Save(sTgt, System.Drawing.Imaging.ImageFormat.Png)
    Case "tiff", "tif"
        oCanvas.Save(sTgt, System.Drawing.Imaging.ImageFormat.Tiff)
    Case Else
        oCanvas.Save(sTgt, System.Drawing.Imaging.ImageFormat.Png)
End Select
特别是对于裁剪.jpg源文件,我最终得到的裁剪图像的文件大小是未裁剪原始文件的5-8倍

例如,我可以输入一个大小为800kb的图像,然后将其中间部分裁剪成一个新图像,保存时该图像的大小超过5mb

如果我没有将jpeg的质量保持在95%或更高,我得到的图像质量比原始图像低,但文件大小仍然相同或更大


我想要的是一个与原作质量相同的图像。是什么原因导致了代码尺寸的大幅增加,即使只是原版的一个裁剪部分?

发现了错误。。。它与图像处理无关。在我选择编码器的最终案例陈述中有一个bug。我捕获扩展名的代码中有“.”字符,但我的案例名称没有,因此,它会自动命中else案例,该案例将图像类型默认为png,这当然是一种无损格式,并且通常具有更大的文件大小。

发现了错误。。。它与图像处理无关。在我选择编码器的最终案例陈述中有一个bug。我捕获扩展名的代码中有“.”字符,但我的案例名称没有,因此,它会自动命中else案例,该案例将图像类型默认为png,这当然是一种无损格式,通常具有更大的文件大小

重新保存为98%jpeg也必然会增大大小。您可能希望查看无损jpeg裁剪工具,尽管它们始终受到jpeg块大小的限制。但是,重新保存为98%jpeg也必然会增加大小。您可能希望了解无损jpeg裁剪工具,尽管它们总是受到jpeg块大小的限制。