質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

3187閲覧

JPEGファイルサイズを変更したい

ka-san

総合スコア2

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/08/25 02:33

前提・実現したいこと

画像ファイル(JPEG形式)が640x480以上の場合にサイズをおとすために640x480(解像度96dpi)に変換したいです。

発生している問題・エラーメッセージ

変換したファイル形式を「Image.RawFormatプロパティ」で確認するとJPEG形式でなくなってしまいます。 JPEGかどうか確認するにはRawFormatでは出来ないのか、それとも変換する方法に誤りがあるのでしょうか。 誤りがある場合はどこに問題があるのでしょうか。

該当のソースコード

aspx

1<asp:FileUpload ID="FileUpload1" runat="server" />

vb

1 Dim fn1 As String = "C:\temp\画像1.JPG" 2 Dim fn2 As String = "C:\temp\画像1変換.JPG" 3 4 Me.FileUpload1.SaveAs(fn1) 5 6 Dim bmp As New Bitmap(fn1) 7 If bmp.RawFormat.Equals(Drawing.Imaging.ImageFormat.Jpeg) Then 8 'JPEG形式 ←こっちになります 9 Else 10 'JPEG形式でない 11 End If 12 13 Dim image As Image = CreatePic(bmp) 14 image.Save(fn2) 15 image.Dispose() 16 bmp.Dispose() 17 18 Dim bmp2 As New Bitmap(fn2) 19 If bmp2.RawFormat.Equals(Drawing.Imaging.ImageFormat.Jpeg) Then 20 'JPEG形式 21 Else 22 'JPEG形式でない ←こっちになってしまいます 23 End If 24 bmp2.Dispose() 25 26 27 28 Private Function CreatePic(image As Image) As Image 29 Dim w = image.Width 30 Dim h = image.Height 31 Dim t = 0 32 Dim xdpi = 96.0F 33 Dim ydpi = 96.0F 34 35 If w > h Then 36 If w >= 640 Then 37 t = 640 38 End If 39 h = CInt((h * t) / w) 40 w = t 41 Else 42 If h >= 640 Then 43 t = 640 44 End If 45 w = CInt((w * t) / h) 46 h = t 47 End If 48 49 Dim ret As New Bitmap(w, h, Drawing.Imaging.PixelFormat.Format24bppRgb) 50 ret.SetResolution(xdpi, ydpi) 51 Dim g = Graphics.FromImage(ret) 52 g.DrawImage(image, 0, 0, w, h) 53 g.Dispose() 54 55 Return ret 56 End Function

補足情報(FW/ツールのバージョンなど)

VisualStudio2015
.netframework 4.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

昔(かなり昔)作ったコードですが、.jpg 画像を FileUpload を使ってアップロードし、指定したサイズの Thumnail を作るコードを紹介しておきます。参考になれば幸いです。

MakeThumb メソッドを見てください。画像ファイルのバイト列を受けて、指定されたサイズに縮小し、結果をバイト列で返します。3 つオーバーロードがありますが、違いはコメントを見てください。

using System; using System.Data; using System.Data.SqlClient; using System.IO; using System.Drawing; using System.Configuration; using System.Drawing.Drawing2D; // 2008-12-17 // 縮小したイメージのギザギザを軽減するために Graphics.InterpolationMode を // 使用するようにした。その場合、縮小に Graphics.DrawImage メソッドを使う必 // 要があり、GetThumbnailImage メソッド、Bitmap コンストラクタを使用している // 部分は変更した。 public class ImageUtils { const int sizeThumb = 69; // thumbimage のサイズ(縦横同じ) const int sizeLarge = 400; // largerimage のサイズ(横幅) 2008-3-22 350 から 400 に変更。 public static int uploadImage(string title, int albumid, Stream data) { // 自分以外もアップロードできるような場合は、ファイルサイズの制限をすべき // (今回はしていない)。 int length = Convert.ToInt32(data.Length); byte[] origImageData = new byte[length]; data.Read(origImageData, 0, length); SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["userConnectionString"].ConnectionString); SqlCommand command = new SqlCommand("INSERT INTO Images (title, origimage, largeimage, thumbimage, album) " + "VALUES ( @title, @origimage, @largeimage, @thumbimage, @albumid); select SCOPE_IDENTITY()", connection); SqlParameter param0 = new SqlParameter("@title", SqlDbType.VarChar, 50); param0.Value = title; command.Parameters.Add(param0); SqlParameter param1 = new SqlParameter("@origimage", SqlDbType.Image); param1.Value = origImageData; command.Parameters.Add(param1); SqlParameter param2 = new SqlParameter("@largeimage", SqlDbType.Image); param2.Value = MakeThumb(origImageData, sizeLarge); command.Parameters.Add(param2); SqlParameter param3 = new SqlParameter("@thumbimage", SqlDbType.Image); param3.Value = MakeThumb(origImageData, sizeThumb, sizeThumb); command.Parameters.Add(param3); SqlParameter param4 = new SqlParameter("@albumid", SqlDbType.Int); param4.Value = albumid; command.Parameters.Add(param4); object result; try { connection.Open(); result = command.ExecuteScalar(); } finally { connection.Close(); } if (result != null) { return System.Convert.ToInt32(result); } else { return 0; } } // sizeThumb で指定されたサイズのサムネイルを作る。 // オリジナルの縦横比は保たれる(高さ or 幅のどちらか大きい方が sizeThumb のサイズになる)。 public static byte[] MakeThumb(byte[] fullsize) { Image iOriginal, iThumb; int targetH, targetW; iOriginal = Image.FromStream(new MemoryStream(fullsize)); if (iOriginal.Height > iOriginal.Width) { targetH = sizeThumb; // オリジナルのコードに誤りあり。割り算は double で計算しないとゼロになる。 // このメソッドは使っていないので誤りに気がつかなかった。double のキャストを追記。 targetW = Convert.ToInt32((double)iOriginal.Width * ((double)sizeThumb / (double)iOriginal.Height)); } else { targetW = sizeThumb; // ここも誤り。double のキャストを追記。 targetH = Convert.ToInt32((double)iOriginal.Height * ((double)sizeThumb / (double)iOriginal.Width)); } // 2008-12-17: ギザギザ軽減のため変更。以下を削除して //iThumb = iOriginal.GetThumbnailImage(targetW, targetH, null, System.IntPtr.Zero); // 以下を追加 iThumb = new Bitmap(targetW, targetH); Graphics g = Graphics.FromImage(iThumb); g.InterpolationMode = InterpolationMode.HighQualityBicubic; Rectangle srcRect = new Rectangle(0, 0, iOriginal.Width, iOriginal.Height); g.DrawImage(iOriginal, new Rectangle(0, 0, targetW, targetH), srcRect, GraphicsUnit.Pixel); MemoryStream m = new MemoryStream(); iThumb.Save(m, System.Drawing.Imaging.ImageFormat.Jpeg); return m.GetBuffer(); } // 指定のサイズのサムネイルを作る。 // 縦横で縮小率が異なる場合、変形されないよう大きい方をトリミングしてから縮小する。 public static byte[] MakeThumb(byte[] fullsize, int newwidth, int newheight) { Image iOriginal, iThumb; double scaleH, scaleW; // トリミングの範囲を指定する。 Rectangle srcRect = new Rectangle(); iOriginal = Image.FromStream(new MemoryStream(fullsize)); // ここも誤り。右辺は double で計算要。オリジナルのサイズが大きいので誤差が小さく、 // かつ画像が 69 x 69 と小さいので気がつかなかったが、変形していた。 scaleH = (double)iOriginal.Height / (double)newheight; scaleW = (double)iOriginal.Width / (double)newwidth; if (scaleH == scaleW) // 縦横の縮小率が同じ → トリミングなし { srcRect.Width = iOriginal.Width; srcRect.Height = iOriginal.Height; srcRect.X = 0; srcRect.Y = 0; } else if ((scaleH) > (scaleW)) // 縮小率が、縦 > 横 → 縦のみトリミング { srcRect.Width = iOriginal.Width; // ここはキャストは必要ないはずだが念のため。 srcRect.Height = Convert.ToInt32((double)newheight * scaleW); srcRect.X = 0; // ここは整数の計算でも可(Convert.ToInt32() は不用)。 srcRect.Y = (iOriginal.Height - srcRect.Height) / 2; } else // 縮小率が、縦 < 横 → 横のみトリミング { // ここはキャストは必要ないはずだが念のため。 srcRect.Width = Convert.ToInt32((double)newwidth * scaleH); srcRect.Height = iOriginal.Height; // ここは整数の計算でも可(Convert.ToInt32() は不用)。 srcRect.X = (iOriginal.Width - srcRect.Width) / 2; srcRect.Y = 0; } iThumb = new Bitmap(newwidth, newheight); Graphics g = Graphics.FromImage(iThumb); // 2008-12-17: ギザギザ軽減のため追加。 g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(iOriginal, new Rectangle(0, 0, newwidth, newheight), srcRect, GraphicsUnit.Pixel); MemoryStream m = new MemoryStream(); iThumb.Save(m, System.Drawing.Imaging.ImageFormat.Jpeg); return m.GetBuffer(); } // 幅のみ指定してサムネイルを作る。高さは幅と同じ縮小率で縮小。 public static byte[] MakeThumb(byte[] fullsize, int maxwidth) { Image iOriginal, iThumb; double scale; iOriginal = Image.FromStream(new MemoryStream(fullsize)); if (iOriginal.Width > maxwidth) { // オリジナルのコードはここに誤り(右辺が整数型)があり、newheight が正しく計算されず // 画像が変形してしまった。キャスト (double) を追加して修正。 scale = (double)iOriginal.Width / (double)maxwidth; int newheight = Convert.ToInt32((double)iOriginal.Height / scale); // 2008-12-17: ギザギザ軽減のため変更。以下を削除して //iThumb = new Bitmap(iOriginal, maxwidth, newheight); // 以下を追加 iThumb = new Bitmap(maxwidth, newheight); Graphics g = Graphics.FromImage(iThumb); g.InterpolationMode = InterpolationMode.HighQualityBicubic; Rectangle srcRect = new Rectangle(0, 0, iOriginal.Width, iOriginal.Height); g.DrawImage(iOriginal, new Rectangle(0, 0, maxwidth, newheight), srcRect, GraphicsUnit.Pixel); MemoryStream m = new MemoryStream(); iThumb.Save(m, System.Drawing.Imaging.ImageFormat.Jpeg); return m.GetBuffer(); } else { return fullsize; } } }

オリジナル画像ファイルのバイト列は、FileUpload.FileContent プロパティを使って Stream オブジェクトを取得し、以下のようなコード (data が取得した Stream) でバイト列に変換してみてください。

int length = Convert.ToInt32(data.Length); byte[] origImageData = new byte[length]; data.Read(origImageData, 0, length);

投稿2021/08/25 04:00

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ka-san

2021/08/25 07:27

このようなやり方があったのですね。ありがとうございました。 試したら同じようにできました。 しかし新たな問題があり、スマホ(iphone12)で撮影した写真だとiOriginal.HeightとiOriginal.Widthが逆になってしまいます。これは私のプログラムでも同様でした。もしご存じでしたら教えていただけますか。それとも新たに質問したほうがよろしいでしょうか。
退会済みユーザー

退会済みユーザー

2021/08/25 07:32

スレッドのタイトル「JPEGファイルサイズを変更したい」や内容と異なることは新たに別のスレッドを立てて質問していただければと思います。Teratail は「価値のあるコンテンツを世の中に残し届ける事を目的としています」ということだそうです。後から検索などでここを訪れた人などにとってはその方が分かりやすいはずですので。
ka-san

2021/08/25 07:45

そのように致します。ありがとうございました。
guest

0

保存時にフォーマットを指定していないからじゃないですかね。
dobon.net - 画像フォーマットを指定して保存する

投稿2021/08/25 02:53

編集2021/08/25 02:54
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ka-san

2021/08/25 07:14

まさにそのとおりでした。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問