Bitmap.Save   zodpovězená otázka

ASP.NET WebForms, Grafika

Dobrý den.

Na webu zmenšuji obrázek, ale nejde mi uložit...

Používám:

Bitmap pct = Resize(this.FileUploat1.FileContent, 200, 200);

- to je ok

Bitamp.Save(Server.MapPath("~/Imgs/My.jpg"), ImageFormat.Jpeg);

- tady to křičí (A generic error occurred in GDI+.)

Nevíte někdo prosím co s tím? Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jak bitmapu vytváříte v té funkci Resize?

nahlásit spamnahlásit spam 0 odpovědětodpovědět
private Bitmap resize(Stream SourceImage, int MaxWidth, int MaxHeight)
    {
        Bitmap a = null;

        using (Image i = Image.FromStream(SourceImage))
        {
            int _maxWidth = (MaxWidth > 0) ? MaxWidth : i.Width;
            int _maxHeight = (MaxHeight > 0) ? MaxHeight : i.Height;
            double _scaleWidth = (double)_maxWidth / (double)i.Width;
            double _scaleHeight = (double)_maxHeight / (double)i.Height;
            double _scale = (_scaleHeight < _scaleWidth) ? _scaleHeight : _scaleWidth;
            _scale = (_scale > 1) ? 1 : _scale;

            int _newWidth = (int)(_scale * i.Width);
            int _newHeight = (int)(_scale * i.Height);

            a = new Bitmap(MaxWidth, MaxHeight);

            using (Graphics g = Graphics.FromImage(a))
            {
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage(i, new Rectangle(0, 0, _newWidth, _newHeight));
                g.Save();
            }
        }
        return a;
    }
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je nutné volat to g.Save? Já totiž používám velmi podobný kód (až na to g.Save, to nevolám, protože se volá Save na té bitmapě) a nezlobí mi to. Zkuste kdyžtak ještě nedávat to Graphics do usingu, třeba se to té bitmapě nelíbí.

Máte do té dané složky práva na zápis? Na každém webhostingu to nebývá.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Bohužel ne... At s tím dělám co chci, pořád ta samá chyba...

Ještě přikládám to, jak to volám:

private string LoadImage()
    {
        Bitmap a = resize(this.FileUpload1.FileContent, 640, 480);

        string p = "~/App_Data/Images/" + Guid.NewGuid().ToString() + ".jpg";
        a.Save(Server.MapPath(p), ImageFormat.Jpeg);
        return p;
    }

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vypište si přesně, co vrací Server.MapPath. Fakt do toho adresáře můžete zapisovat?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkoušel jsem i jiné úložistě, ale prostě nic...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Neznáte třeba jiný kód, který by mohl fungovat?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já úspěšně používám tohle:

        ''' <summary>
        ''' Vytvoří a udělá náhled obrázku
        ''' </summary>
        Friend Shared Function CreateThumbnail(ByVal id As Integer) As Size
            Dim orig As New Bitmap(GetImagePhysicalPath(id))

            'vytvořit náhled
            Dim b As New Bitmap(Uraeus.Config.PhotoGallery.ThumbnailWidth, Uraeus.Config.PhotoGallery.ThumbnailHeight)
            Dim g As Graphics = Graphics.FromImage(b)
            g.Clear(Color.White)
            g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
            Dim thumbSize As Size = GetImageSize(orig.Width, orig.Height, b.Width, b.Height)
            If thumbSize.IsEmpty Then thumbSize = New Size(orig.Width, orig.Height)
            g.DrawImage(orig, CInt((b.Width - thumbSize.Width) / 2), CInt((b.Height - thumbSize.Height) / 2), thumbSize.Width, thumbSize.Height)
            SaveImage(b, GetThumbnailPhysicalPath(id))
            g.Dispose()
            b.Dispose()
        End Function

        ''' <summary>
        ''' Uloží obrázek ve formátu JPEG ve vysoké kvalitě
        ''' </summary>
        Public Shared Sub SaveImage(ByVal b As Bitmap, ByVal filename As String)
            Dim params As New EncoderParameters(1) : params.Param(0) = New EncoderParameter(Encoder.Quality, 92)
            b.Save(filename, ImageCodecInfo.GetImageEncoders().First(Function(c) c.MimeType = "image/jpeg"), params)
        End Sub
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jelikoz dojde drive zavolani metod Disponse() (vas using) na objekt g a i pred zavolanim return , dojde k chybe v navratove bitmape a.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je ovšem teoreticky blbost protože tu bitmapu a nadeklaroval na začátku funkce a v usingu do ní jen přiřadil.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky. Vyřešeno

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback