2009-08-25 5 views
2

사용자가 이미지를 업로드 할 수 있지만 이미지를 업로드 할 수있게 해주는 fileupload 컨트롤이 있습니다. 이미지를 크기가 640x480 크기로 변경하려는 경우 다음에 수행 할 작업을 파악할 수 없습니다. 이것이 내가 가진 것입니다.파일에 스트림 저장

// CALL THE FUNCTION THAT WILL RESIZE THE IMAGE 
protected void btnUploadFile_Click(object sender, EventArgs e) 
{ 
    Stream imgStream = ir.ResizeFromStream(640, fupItemImage.PostedFile.InputStream); 

    // What to do next? 
} 

// THE FUNCTION THAT WILL RESIZE IMAGE THEN RETURN AS MEMORY STREAM 
public MemoryStream ResizeFromStream(int MaxSideSize, Stream Buffer) 
{ 
    int intNewWidth; 
    int intNewHeight; 
    System.Drawing.Image imgInput = System.Drawing.Image.FromStream(Buffer); 

    // GET IMAGE FORMAT 
    ImageFormat fmtImageFormat = imgInput.RawFormat; 

    // GET ORIGINAL WIDTH AND HEIGHT 
    int intOldWidth = imgInput.Width; 
    int intOldHeight = imgInput.Height; 

    // IS LANDSCAPE OR PORTRAIT ?? 
    int intMaxSide; 

    if (intOldWidth >= intOldHeight) 
    { 
     intMaxSide = intOldWidth; 
    } 
    else 
    { 
     intMaxSide = intOldHeight; 
    } 


    if (intMaxSide > MaxSideSize) 
    { 
     // SET NEW WIDTH AND HEIGHT 
     double dblCoef = MaxSideSize/(double)intMaxSide; 
     intNewWidth = Convert.ToInt32(dblCoef * intOldWidth); 
     intNewHeight = Convert.ToInt32(dblCoef * intOldHeight); 
    } 
    else 
    { 
     intNewWidth = intOldWidth; 
     intNewHeight = intOldHeight; 
    } 

    // CREATE NEW BITMAP 
    Bitmap bmpResized = new Bitmap(imgInput, intNewWidth, intNewHeight); 

    // SAVE BITMAP TO STREAM 
    MemoryStream imgMStream = new MemoryStream(); 
    bmpResized.Save(imgMStream, imgInput.RawFormat); 

    // RELEASE RESOURCES 
    imgInput.Dispose(); 
    bmpResized.Dispose(); 
    Buffer.Close(); 

    return imgMStream; 
} 

감사합니다

답변

1

아마 같은 모양의 파일에 덤프

int length = 256; 
int bytesRead = 0; 
Byte[] buffer = new Byte[length]; 
using (FileStream fs = new FileStream(filename, FileMode.Create)) 
{ 
    do 
    { 
    bytesRead = imgStream.Read(buffer, 0, length); 
    fs.Write(buffer, 0, bytesRead); 
    } 
    while (bytesRead == length); 
} 
+0

'imgStream.Position = 0'을 설정하여'imgStream'의 위치를 ​​먼저 되 감을 필요가 있습니다. –

+0

FWIW, bytesRead! = length이지만 bytesRead! = 0은 완벽하게 유효하며 스트림 imgStream은 비어 있지 않습니다. NetworkStream. 'while (bytesRead! = 0)'이 더 안전합니다. –

+0

(imgStream은이 경우 메모리 스트림입니다.하지만 하나의 스트림에서 다른 스트림으로 복사 할 때 일반적으로 'Stream'의 의미 계약을 아는 것이 좋습니다.) –

0

같은 :하지만 당신이있는 경우,

using (FileStream fsOut = new FileStream("my\\file\\path.img", FileMode.Create)) 
using (MemoryStream msImg = new MemoryStream(ir.ResizeFromStream(640 ...))) 
{ 
    byte[] imgData = msImg.ToArray(); 
    fsOut.Write(imgData, 0, imgData.Length); 
} 
0

가 난 단지 빠른 눈에 걸렸다을 이미 이미지 크기를 성공적으로 수행 한 다음 System.IO 이름 공간 파일 클래스를 사용하여 메모를 저장하면됩니다. 생성 한 File 객체에 메모리 스트림의 바이트를 기록하여 파일에 스트림을 전달합니다. 코드 예제가 필요한 경우 알려주십시오. 당신이 ResizeFromStream에 의해 반환 된 스트림을 사용하지 않는 경우

+0

감사합니다. 예제 코드를 게시하십시오. –

0
FileStream fs=new FileStream("filename",FileMode.Create); 
ir.ResizeFromStream(640, fupItemImage.PostedFile.InputStream).WriteTo(fs); 
fs.Close(); 
+0

감사합니다. 나는 이것을 시도 할 것이다. –

+0

파일을 만들었지 만 비어 있습니다. 나는 그런데 이미지를 올리려고했지만 아무 것도 없었습니다. –

0

당신은 또한 그 방법을 변경하고 변환 된 Bitmap를 반환 할 수 있습니다. 그리고 Bitmap.Save(<path>)을 사용하여 이미지를 파일로 저장하십시오.

0
  1. 예외가 발생하면 현재 코드가 리소스를 유출합니다. finally 또는 catch 블록에 항상 .Dispose에 대한 호출을해야합니다 (리소스가 항상 삭제되어야하는지 아니면 오류 발생시 처분해야하는지에 따라 다름). try ... finally Dispose는 using 키워드로 간결하게 작성할 수 있습니다. - 앞으로의 두통을 피하고 모든 IDisposables를 using 또는 try..catch 블록에 넣으십시오.
  2. Windows Forms를 사용하여 이미지의 크기를 변경하면 기본적으로 품질이 낮은 리샘플링러가 사용됩니다. 이것은 일반적으로 나쁜 결과를 가져옵니다. 적절한 보간 모드를 구체적으로 설정해야합니다 (코드는 아래 참조).
  3. 이미지를 저장하는 경우 이미지 코덱 설정 문제가 발생할 수 있습니다. 예를 들어 기본 jpeg 인코더는 기본적으로 출력 품질이 매우 낮습니다. 이것 역시 수동으로 설정해야합니다 (아래 참조).
  4. 마지막으로 파일을 디스크 나 데이터베이스에 저장하는 것이 실제로 가장 쉬운 방법입니다. 대신 memorystream에 저장하는 대신 스트림 매개 변수를 대신 사용하십시오. 이 매개 변수는 호출자가 필요에 따라 파일이나 데이터베이스에 쓸 수 있도록 구성 할 수 있습니다.

는 I, 이미지 크기 조정은 다음 함수를 사용하여 (이 종횡비를 변경한다) : JPEG 등의 파일을 저장

public static Bitmap Resize(Image oldImage, int newWidth, int newHeight) 
{ 
    Bitmap bitmap = null; 
    try 
    { 
     bitmap = new Bitmap(newWidth, newHeight); 
     using (Graphics g = Graphics.FromImage(bitmap)) 
     { 
      g.SmoothingMode = SmoothingMode.HighQuality; 
      g.PixelOffsetMode = PixelOffsetMode.HighQuality; 
      g.CompositingQuality = CompositingQuality.HighQuality; 
      g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      g.DrawImage(oldImage, new Rectangle(0, 0, newWidth, newHeight)); 
     } 
    } 
    catch 
    { 
     if (bitmap != null) bitmap.Dispose(); 
     throw; 
    } 
    return bitmap; 
} 

를 통해 예를 들면 수행 될 수있다 :

public static void SaveImageAsJpeg(Image image, Stream outputStream, int quality) 
{ 
    ImageCodecInfo jpgInfo = ImageCodecInfo.GetImageEncoders() 
     .Where(codecInfo => codecInfo.MimeType == "image/jpeg").First(); 
    using (EncoderParameters encParams = new EncoderParameters(1)) 
    { 
     encParams.Param[0] = new EncoderParameter(Encoder.Quality,(long)quality); 
     //quality should be in the range [0..100] 
     image.Save(outputStream, jpgInfo, encParams); 
    } 
} 

어느 당신은 무엇의 라인을 따라 뭔가를 통해 사용할 수 ...

using(var origImage=Image.FromStream(inputStream, true, true)) 
{ 
    //set newWidth, newHeight however you wish; determine outputFilePath 
    using(var newImage = Resize(origImage, newWidth, newHeight)) 
    using(var outputStream = File.Open(outputFilePath, FileMode.Create)) 
     SaveImageAsJpeg(newImage,outputStream, 90); 
}