2010-06-02 2 views
4

내가 asp.net.NET의 Drawing.Graphics.FromImage()가 빈 검은 이미지

에 업로드 된 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

, 당신은 그런 식으로 빈 이미지를 얻을 수 있음을 교체하십시오 .

이미지 크기를 조정하는 대신 채우기 배경을 크기 조정 영역에 사용할 수 있습니다.

확인이 아웃 :

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); 

희망이
마이 라 데 도움이

+0

감사합니다. 나는 조금 다르게했지만 코드는 좋은 그림이었습니다 – joox

+0

** 이미지의 배경이있는 곳을 정확히 ** 정확히 채웠습니까 **? –

+0

g.DrawImage 줄에 (img, drect); ,이 코드는 백그라운드를 채 웁니다! – Myra

0

이 시도 : 를 - 스트림 에서 이미지를 얻을 - 올바른 크기의 새 비트 맵을 만들 - 원본 비트가 아닌 새로운 비트 맵에서 Graphics 객체 가져 오기 - g.DrawImage (원본, 0, 완료, 완료, 완료, 높이)

편집 : 당신은 검은 색 비트 맵을 만들

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

, g로 지정된 해상도 : 문제는이 부분이다. 실제로 g에서 오는 이미지 데이터로 비트 맵을 생성하지는 않습니다. 사실 Graphics 객체는 실제 전달할 수있는 이미지 데이터를 실제로 저장하지 않는다고 생각합니다. 이미지 데이터를 저장하는 객체를 조작 할 수 있습니다.

것은 b.Save (...) 당신이 이미지는 InputStream로부터 읽는의 배경 지역을 기입하지 않았기 때문에

+0

'b.Save (...)이'이미지 데이터를 저장 않지만, 변환이 적용되지 않습니다. 'b = new Bitmap (original, newWidth, newHeight)'를 사용하면 쉽게 재조정 할 수 있습니다. 그러나 실제로 rescale, crop, rotate를 포함한 원본 이미지를 일련의 변환해야하므로, 'Graphics'를 호출하여 최종 결과를 비트 맵으로 렌더링합니다. 'Graphics' 객체를 오해하고 있습니까? – joox

+0

올바른 패턴은 무엇입니까? 1) JPEG 파일을 가져옵니다. 2) 순차적으로 여러 개의 변형을 적용합니다. 3) 저장합니까? 간단한 소리 ... – joox

+0

나는 당신이 오해의 변환이라고 말하는 것이 더 가깝다고 생각합니다. 저는 약 7 년 전 대학 때부터 변형을 다루지 않았으므로 녹슬 었어요. 그러나 회전과 함께 간단한 테스트를했고 효과가있었습니다. 트릭은 이미지 데이터를 회전시키지 않고 그래픽 컨텍스트를 회전 한 다음 회전 된 컨텍스트를 사용하여 이미지를 그려야한다는 것입니다. 그래서 제 경우에는 g.RotateTransform()에 대한 호출이 g.DrawImage() 호출 전에 발생해야했습니다. 그게 너 한테 영향을 미치게 될거야 ... 말하기가 어렵다.그러나 변환의 누적 효과는 재미있을 수 있으며 조작 순서가 중요 할 수 있습니다. – joelt