2016-06-21 17 views
0

リモートサーバーにある自分のサーバーでイメージのサイズを変更しています。これは完全に機能しますが、一部の画像では完全に間違ってサイズ変更されます。異なるDPIを使用したASP.NETイメージのサイズ変更

この画像は完璧に動作します: http://www.topwedding.com/bigimage/Wedding%20Dresses/HSTSKN510/Strapless-Mermaid-Appliqued-Wedding-Dress-with-Ruched-Bodice-and-Pick-Up-Skirt.jpg

しかし、例えば、このイメージを、ひどく動作し、本当に小さなされて終わる:それは最初の画像は72ピクセル/インチを持ってい判明 http://www.topwedding.com/bigimage/Wedding%20Dresses/HS01116007/Floral-One-Shoulder-Organza-over-Satin-A-Line-Bridal-Gown-with-Pick-Ups.jpg

検査の際に第2の画像は951ピクセル/インチである。

悪いサイズ変更は私が前にいたのと同じ問題でした(hereを参照)

しかし、私は他のポストで提案されているようにそれが今、私のコードでPixelWidthPixelHeightプロパティを使用することによって解決したと思いました。

目的は、200ピクセル幅のサムネイルを製品概要ページに表示することです。イメージのサイズが同じになるようにするにはどうすればよいですか?

完全なコードは、以下である:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    ResizeAndSaveFast(200, 200, "http://www.topwedding.com/bigimage/Wedding%20Dresses/HSTSKN510/Strapless-Mermaid-Appliqued-Wedding-Dress-with-Ruched-Bodice-and-Pick-Up-Skirt.jpg", Server.MapPath("images\") + "1.png") 
    ResizeAndSaveFast(200, 200, "http://www.topwedding.com/bigimage/Wedding%20Dresses/HS01116007/Floral-One-Shoulder-Organza-over-Satin-A-Line-Bridal-Gown-with-Pick-Ups.jpg", Server.MapPath("images\") + "2.png") 
End Sub 



Private Function ResizeAndSaveFast(ByVal maxWidth As Integer, ByVal maxHeight As Integer, ByVal imageURL As String, ByVal saveToPath As String) As Boolean 
    Dim imgRequest As WebRequest = WebRequest.Create(imageURL) 
    Dim imgResponse As WebResponse 
    imgResponse = imgRequest.GetResponse() 

    Dim streamPhoto As Stream = imgResponse.GetResponseStream() 
    Dim memStream As New MemoryStream 
    streamPhoto.CopyTo(memStream) 
    memStream.Position = 0 

    Dim bfPhoto As BitmapFrame = ReadBitmapFrame(memStream) 

    Dim newWidth, newHeight As Integer 
    Dim scaleFactor As Double 

    newWidth = bfPhoto.PixelWidth 
    newHeight = bfPhoto.PixelHeight 
    If bfPhoto.PixelWidth > maxWidth Or bfPhoto.PixelHeight > maxHeight Then 
     If bfPhoto.PixelWidth > maxWidth Then 
      scaleFactor = maxWidth/bfPhoto.PixelWidth 
      newWidth = Math.Round(bfPhoto.Width * scaleFactor, 0) 
      newHeight = Math.Round(bfPhoto.Height * scaleFactor, 0) 
     End If 
     If newHeight > maxHeight Then 
      scaleFactor = maxHeight/newHeight 
      newWidth = Math.Round(newWidth * scaleFactor, 0) 
      newHeight = Math.Round(newHeight * scaleFactor, 0) 
     End If 
    End If 

    Dim bfResize As BitmapFrame = FastResize(bfPhoto, newWidth, newHeight) 

    If bfResize Is Nothing Then Return False 

    Dim baResize As Byte() = ToByteArray(bfResize) 
    File.WriteAllBytes(saveToPath, baResize) 
    Return True 

End Function 

答えて

1

現在のコードはまだ(「幅」スケールファクタのために)その計算にbfPhoto.WidthbfPhoto.Heightを使用します。時にはあなただけの年齢のためのコードを見た後...

Private Function ResizeAndSaveFast(ByVal maxWidth As Integer, ByVal maxHeight As Integer, ByVal imageURL As String, ByVal saveToPath As String) As Boolean 

    ... 

    Dim bfPhoto As BitmapFrame = ReadBitmapFrame(memStream) 

    Dim scaleFactorWidth As Double = Math.Min(1.0, maxWidth/bfPhoto.PixelWidth) 
    Dim scaleFactorHeight As Double = Math.Min(1.0, maxHeight/bfPhoto.PixelHeight) 
    Dim scaleFactor As Double = Math.Min(scaleFactorWidth, scaleFactorHeight) 
    Dim newWidth As Integer = Math.Round(bfPhoto.PixelWidth * scaleFactor, 0) 
    Dim newHeight As Integer = Math.Round(bfPhoto.PixelHeight * scaleFactor, 0) 

    Dim bfResize As BitmapFrame = FastResize(bfPhoto, newWidth, newHeight) 

    ... 

End Function 
+0

Arghh:あなただけbfPhoto.PixelWidthbfPhoto.PixelHeightを使用し、またサムネイルのサイズが指定された最大の幅と高さを超えないことを確認する次のコードを試すことができますこのようなものを逃す...ありがとう! – Flo

+0

あなたは大歓迎です。 :-) – ConnorsFan

関連する問題