6

asp.netでアップロードされたjpegを再スケーリングしようとしています

だから私は行きます:

Image original = Image.FromStream(myPostedFile.InputStream);
int w=original.Width, h=original.Height;

using(Graphics g = Graphics.FromImage(original))
{
 g.ScaleTransform(0.5f, 0.5f); ... // e.g.
 using (Bitmap done = new Bitmap(w, h, g))
 {
  done.Save( Server.MapPath(saveas), ImageFormat.Jpeg );
  //saves blank black, though with correct width and height
 }
}

これにより、どのファイルを指定しても、バージンブラックのjpegが保存されます。入力画像ストリームをすぐにビットマップに取り込むdoneと、次のように再圧縮して正常に保存されます。

Image original = Image.FromStream(myPostedFile.InputStream);
using (Bitmap done = new Bitmap(original))
{
 done.Save( Server.MapPath(saveas), ImageFormat.Jpeg );
}

gで魔法をかける必要がありますか?

upd:試しました:

Image original = Image.FromStream(fstream);
int w=original.Width, h=original.Height;
using(Bitmap b = new Bitmap(original)) //also tried new Bitmap(w,h)
 using (Graphics g = Graphics.FromImage(b))
 {
  g.DrawImage(original, 0, 0, w, h); //also tried g.DrawImage(b, 0, 0, w, h)
  using (Bitmap done = new Bitmap(w, h, g))
  {
   done.Save( Server.MapPath(saveas), ImageFormat.Jpeg );
  }
 }

同じ話-正しい寸法の純粋な黒

4

2 に答える 2

6

inputStreamから読み取っている画像の背景で領域を塗りつぶしていないため、その方法では空白の画像しか取得できません。

画像の拡大縮小を使用する代わりに、サイズ変更された領域に背景を塗りつぶすを使用できます。

これをチェックしてください:

Image img = Image.FromFile(Server.MapPath("a.png"));
int w = img.Width;
int h = img.Height;

//Create an empty bitmap with scaled size,here half
Bitmap bmp = new Bitmap(w / 2, h / 2);
//Create graphics object to draw
Graphics g = Graphics.FromImage(bmp);
//You can also use SmoothingMode,CompositingMode and CompositingQuality
//of Graphics object to preserve saving options for new image.        

//Create drawing area with a rectangle
Rectangle drect = new Rectangle(0, 0, bmp.Width, bmp.Height);
//Draw image into your rectangle area
g.DrawImage(img, drect);
//Save your new image
bmp.Save(Server.MapPath("a2.jpg"), ImageFormat.Jpeg);


これがマイラに役立つことを願っています

于 2010-06-02T15:15:14.280 に答える
0

これを試してください:-ストリームから画像を取得します-正しいサイズの新しいビットマップを作成します-元のビットマップではなく、新しいビットマップからグラフィックスオブジェクトを取得します-g.DrawImage(original、0、0、done.Width、doneを呼び出します。身長)

編集:問題はこのセクションです:

using (Bitmap done = new Bitmap(w, h, g)) 
  { 
   done.Save( Server.MapPath(saveas), ImageFormat.Jpeg ); 
  }

gで指​​定された解像度で黒いビットマップを作成しています。gからの画像データを使用して実際にビットマップを作成しているわけではありません。実際、Graphicsオブジェクトは、実際に渡すことができる画像データを実際に格納しているとは思いません。画像データを格納しているオブジェクトを操作できるようにするだけです。

それをb.Save(...)に置き換えてみてください

于 2010-06-02T13:18:39.150 に答える