Siehe anhang

-----Urspr�ngliche Nachricht-----
Von: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Im
Auftrag von Pessner, Andreas
Gesendet: Donnerstag, 15. Juli 2004 09:31
An: [EMAIL PROTECTED]
Betreff: [Asp.net] Bilder skalieren

Ich suche nach einer M�glichkeit um Bilder zu skalieren.

Das ganze ist so gedacht - das ein Bild hochgeladen wird - und dazu kann
eine Breite und H�he angegeben werden. Dann soll das Bild auf dem Server in
das neue Format gebracht werden und abgespeichert werden.

Quasi so: Bild mit 1024*768 wird hochgeladen. Als neue Gr��e wird 640*480
�bergeben - und dann soll der Server das Bild mit 640*480 neu erstellen -
und abspeichern.

Wie das f�r Thumbnails geht ist mir klar - aber da leidet die Qualit�t
leider betr�chtlich wenn es gr��er als 300*300 Pixel sein soll! (�ber
Bitmap. GetThumbnailImage)

(Das steht dazu in der Hilfe: GetThumbnailImage funktioniert gut, wenn die
angeforderte Miniaturansicht eine Gr��e von ca. 120 x 120 hat. Eine
Anforderung einer gro�en Miniaturansicht (z. B. 300 x 300) eines
Image-Objekts mit einer eingebetteten Miniaturansicht kann zu einem
deutlichen Qualit�tsverlust bei der Miniaturansicht f�hren. Es kann ggf.
ratsam sein, das Hauptbild anstelle der eingebetteten Miniaturansicht zu
skalieren, indem Sie DrawImage aufrufen.)

Dort wird auf DrawImage aus der Graphics Klasse verwiesen - aber irgendwie
bekomme ich das nicht hin - bzw. mir fehlt dazu der richtige Ansatz!

Hat dazu vielleicht jemand einen Hinweis wie so was richtig geht?

So habe ich es versucht:

Bitmap myBM = aus Datei geladen
Systems.Drawing.Graphics G = Systems.Drawing.Graphics.FromImage(myBM);

G.DrawImage(myImg, 0, 0, 640, 480);
myBM.Save(...);

Aber irgendwie �ndert der das nicht - oder speichert zumindest nicht die
�nderungen in die Datei rein.

Vorschl�ge?

Mit freundlichen Gr��en
Andreas

_______________________________________________
Asp.net Mailingliste, Postings senden an:
[EMAIL PROTECTED]
An-/Abmeldung und Suchfunktion unter:
http://www.glengamoi.com/mailman/listinfo/asp.net
using System;
using System.Drawing;
using System.Drawing.Imaging;   
using System.Drawing.Drawing2D;
using System.IO;

namespace CMS.Kernel
{
        
        public class ThumbMaker
        {
                Double xFactor;
                Double yFactor;
                System.IntPtr sourceScan0;
                int sourceStride;
                Bitmap scaledBitmap, bitmap;
                
                public ThumbMaker(string fileName)
                {
                        bitmap = new Bitmap(fileName);
                }

                public ThumbMaker(Stream stream)
                {
                        bitmap = new Bitmap(stream);
                }
                
                void AdjustSizes(ref int xSize, ref int ySize)
                {
                        if (xSize != 0 && ySize == -1)
                                ySize = Math.Abs((int) (xSize * bitmap.Height / 
bitmap.Width));
                        else if (xSize == 0 && ySize != 0)
                                xSize = Math.Abs((int) (ySize * bitmap.Width / 
bitmap.Height));
                        else if (xSize == 0 && ySize == -1)
                        {
                                xSize = bitmap.Width;
                                ySize = bitmap.Height;
                        }
                }

                //Internal resize for indexed colored images
                void IndexedRezise(int xSize, int ySize)
                {       
                        BitmapData sourceData;
                        BitmapData targetData;                  
                        
                        AdjustSizes(ref xSize, ref ySize);

                        scaledBitmap = new Bitmap(xSize, ySize, bitmap.PixelFormat);
                        scaledBitmap.Palette = bitmap.Palette;                  
                        sourceData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, 
bitmap.Height),
                                ImageLockMode.ReadOnly, bitmap.PixelFormat);
                        try
                        {
                                targetData = scaledBitmap.LockBits(new Rectangle(0, 0, 
xSize, ySize),
                                        ImageLockMode.WriteOnly, 
scaledBitmap.PixelFormat);
                                try
                                {
                                        xFactor = (Double) bitmap.Width / (Double) 
scaledBitmap.Width;
                                        yFactor = (Double) bitmap.Height / (Double) 
scaledBitmap.Height;
                                        sourceStride = sourceData.Stride; 
                                        sourceScan0 = sourceData.Scan0;
                                        int targetStride = targetData.Stride; 
                                        System.IntPtr targetScan0 = targetData.Scan0;
                                        unsafe 
                                        { 
                                                byte * p = (byte *)(void *)targetScan0;
                                                int nOffset = targetStride - 
scaledBitmap.Width; 
                                                int nWidth = scaledBitmap.Width;
                                                for(int y=0;y < 
scaledBitmap.Height;++y)
                                                {
                                                        for(int x=0; x < nWidth; ++x )
                                                        {
                                                                p[0] = 
GetSourceByteAt(x, y);
                                                                ++p;
                                                        }
                                                        p += nOffset;
                                                }
                                        }
                                }
                                finally
                                {
                                        scaledBitmap.UnlockBits(targetData);
                                }
                        }
                        finally
                        {
                                bitmap.UnlockBits(sourceData);
                        }       
                }
                
                //This gets the color index on the source image for coords x, y on the 
resized target image
                byte GetSourceByteAt(int x, int y)
                {
                        unsafe
                        {
                                return ((byte*) ((int)sourceScan0 + (int) 
(Math.Floor(y * yFactor) * sourceStride) +
                                        (int) Math.Floor(x * xFactor)))[0];
                        }
                        
                }

                //Internal resize for RGB colored images
                void RGBRezise(int xSize, int ySize)
                {
                        AdjustSizes(ref xSize, ref ySize);
                        scaledBitmap = new Bitmap(xSize, ySize, 
PixelFormat.Format24bppRgb);
                        Graphics g = Graphics.FromImage(scaledBitmap);
                        Rectangle destRect = new Rectangle(0, 0, xSize, ySize);
                        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                        g.SmoothingMode = SmoothingMode.AntiAlias;
                        g.DrawImage(bitmap, destRect);
                }

                void Save(string fileName, ImageFormat format)
                {
                        scaledBitmap.Save(fileName, format);
                }

                void Save(string fileName, long jQuality, ImageFormat format)
                {        
                        ImageCodecInfo jpegCodecInfo =  GetEncoderInfo("image/jpeg");  
 
                        Encoder qualityEncoder = Encoder.Quality;                      
  
                        EncoderParameters encoderParams = new EncoderParameters(1);
                        EncoderParameter qualityEncoderParam = new 
EncoderParameter(qualityEncoder, jQuality);
                        encoderParams.Param[0] = qualityEncoderParam;
                        scaledBitmap.Save(fileName, jpegCodecInfo, encoderParams);
                }

                void Save(Stream stream, ImageFormat format)
                {
                        scaledBitmap.Save(stream, format);
                }

                void Save(Stream stream, long jQuality, ImageFormat format)
                {       
                        ImageCodecInfo jpegCodecInfo =  GetEncoderInfo("image/jpeg");  
 
                        Encoder qualityEncoder = Encoder.Quality;                      
  
                        EncoderParameters encoderParams = new EncoderParameters(1);
                        EncoderParameter qualityEncoderParam = new 
EncoderParameter(qualityEncoder, jQuality);
                        encoderParams.Param[0] = qualityEncoderParam;
                        scaledBitmap.Save(stream, jpegCodecInfo, encoderParams);
                }

                ImageCodecInfo GetEncoderInfo(String mimeType)
                {
                        int j;
                        ImageCodecInfo[] encoders;
                        encoders = ImageCodecInfo.GetImageEncoders();
                        for(j = 0; j < encoders.Length; ++j)
                        {
                                if(encoders[j].MimeType.ToUpper() == 
mimeType.ToUpper())
                                        return encoders[j];
                        }
                        return null;
                }

                public void ResizeToJpeg(int xSize, int ySize, string fileName)
                {
                        this.RGBRezise(xSize, ySize);
                        this.Save(fileName, ImageFormat.Jpeg);
                }
                
                public void ResizeToJpeg(int xSize, int ySize, Stream stream)
                {
                        this.RGBRezise(xSize, ySize);
                        this.Save(stream, ImageFormat.Jpeg);
                }

                public void ResizeToJpeg(int xSize, int ySize, long jQuality, string 
fileName)
                {
                        this.RGBRezise(xSize, ySize);
                        this.Save(fileName, jQuality, ImageFormat.Jpeg);
                }
                
                public void ResizeToJpeg(int xSize, int ySize, long jQuality, Stream 
stream)
                {
                        this.RGBRezise(xSize, ySize);
                        this.Save(stream, jQuality, ImageFormat.Jpeg);
                }

                
                public void ResizeToGif(int xSize, int ySize, string fileName)
                {
                        this.IndexedRezise(xSize, ySize);
                        this.Save(fileName, ImageFormat.Gif);
                }
                
                public void ResizeToGif(int xSize, int ySize, Stream stream)
                {
                        this.IndexedRezise(xSize, ySize);
                        this.Save(stream, ImageFormat.Gif);
                }

                public void ResizeToPng(int xSize, int ySize, string fileName)
                {
                        this.IndexedRezise(xSize, ySize);
                        this.Save(fileName, ImageFormat.Png);
                }
                
                public void ResizeToPng(int xSize, int ySize, Stream stream)
                {
                        this.IndexedRezise(xSize, ySize);
                        this.Save(stream, ImageFormat.Png);
                }

                public void Dispose() {
                        bitmap.Dispose();
                }

        }
}

Antwort per Email an