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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

5389閲覧

C# 画像のトリミングを高速に行いたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2020/11/06 13:32

C#で5500x3500サイズの画像をサイズ150x150で切り抜いてPictureBoxに表示したいのですが、
もっと高速な方法はあるのでしょうか?
全部500ms近くかかってしまいます。

VisualStudio2017 C#

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Diagnostics; 6using System.Drawing; 7using System.Drawing.Imaging; 8using System.IO; 9using System.Linq; 10using System.Runtime.InteropServices; 11using System.Text; 12using System.Threading.Tasks; 13using System.Windows.Forms; 14 15 16namespace 画像読込テスト 17{ 18 public partial class Form1 : Form 19 { 20 public Form1() 21 { 22 InitializeComponent(); 23 } 24 25 private void button1_Click(object sender, EventArgs e) 26 { 27 FileStream stream = File.OpenRead(@"D:\画像5500_3500.png"); 28 Image image = Image.FromStream(stream, false, false); 29 pictureBox1.Image = image; 30 31 var sw = new System.Diagnostics.Stopwatch(); sw.Start(); 32 pictureBox2.Image = ImageRoi(new Bitmap(image), new Rectangle(3921, 833, 150, 150)); 33 sw.Stop(); Console.WriteLine($" {sw.ElapsedMilliseconds}ミリ秒"); 34 35 sw.Restart(); 36 pictureBox2.Image = ImageRoi2(new Bitmap(image), new Rectangle(3921, 833, 150, 150)); 37 sw.Stop(); Console.WriteLine($" {sw.ElapsedMilliseconds}ミリ秒"); 38 39 sw.Restart(); 40 pictureBox2.Image = ImageRoi3(new Bitmap(image), new Rectangle(3921, 833, 150, 150)); 41 sw.Stop(); Console.WriteLine($" {sw.ElapsedMilliseconds}ミリ秒"); 42 43 } 44 45 Bitmap ImageRoi(Bitmap src, Rectangle roi) 46 { 47 Bitmap dst = new Bitmap(roi.Width, roi.Height); 48 Graphics g = Graphics.FromImage(dst); 49 Rectangle srcRect = roi; 50 Rectangle dstRect = roi; 51 g.DrawImage(src, dstRect, srcRect, GraphicsUnit.Pixel); 52 g.Dispose(); 53 return dst; 54 } 55 56 public Bitmap ImageRoi2(Bitmap src, Rectangle roi) 57 { 58 Bitmap bmpNew = src.Clone(roi, src.PixelFormat); 59 return bmpNew; 60 } 61 62 static public Bitmap ImageRoi3(Bitmap sourceImage, Rectangle rectangle) 63 { 64 Bitmap src = sourceImage; 65 Bitmap target = new Bitmap(rectangle.Width, rectangle.Height); 66 using (Graphics g = Graphics.FromImage(target)) 67 { 68 g.DrawImage(src, new Rectangle(0, 0, target.Width, target.Height), rectangle, GraphicsUnit.Pixel); 69 } 70 return target; 71 } 72 } 73}

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

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

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

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

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

guest

回答1

0

ベストアンサー

csharp

1pictureBox2.Image = ImageRoi(new Bitmap(image), new Rectangle(3921, 833, 150, 150));

new Bitmap(image)してますけど、毎回5500x3500の画像のコピーを作成する事になりますが、これが重いだけじゃないですか?

投稿2020/11/06 15:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/11/06 23:07

おっしゃる通りでした。ありがとうございます! 各関数40~0msになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問