Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C#/ASP.NET] Resizen afbeelding met behoud van verhouding

Pagina: 1
Acties:

  • Kyoshi
  • Registratie: December 2006
  • Laatst online: 14-11 22:14
Ik zit al een tijd te zoeken om een oplossing te vinden voor het volgende:

Ik heb een webapplicatie die vanuit user input een aantal afbeeldingen moet laten zien.
Nu wil ik deze afbeeldingen (meestal een stuk of 3-5) als een kleine galerie laten zien. Het probleem is dat het een visitekaartje kan zijn tot een A3 poster, dus wil ik de afbeeldingen plaatsen met behoud van de verhouding en niet zoals huidig met een statische afmeting. Daarnaast moet het een thumbnail zijn die doorlinkt naar de lokatie van de originele afbeelding om deze volledig in een nieuw venster te zien.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Images ophalen » rProduct en rItem is het gevraagde product en itemnummer
            string getImageQuery = "SELECT image FROM images WHERE product ='" + rProduct + "' AND item =" + rItem + ";";
            SqlCommand sqlcmdgetImages = new SqlCommand(getImageQuery, verbinding);
            verbinding.Open();
            SqlDataReader getImagesReader = sqlcmdgetImages.ExecuteReader();
            while (getImagesReader.Read())
            {
                // De bestandsstructuur is gebaseerd op de datum van het item
                string imageFileName = Convert.ToString(getImagesReader.GetValue(0));
                // Kijken of het een JPEG-afbeelding of PDF-afbeelding is
                string fileExtention = new string(imageFileName.ToCharArray((imageFileName.Length - 3), 3));
                if (fileExtention == "jpg")
                    {
                        // Locatie van het item zoeken
                        string imageYear = itemDate.ToString("yyyy");
                        int imageMonth = itemDate.Month;
                        string imagePath = "/images/" + imageYear + "/" + imageMonth + "/" + imageFileName;  


Ik heb wat zitten zoeken en ben tot dit stukje code gekomen maar dat wil ook niet echt werken:
Bovendien wil ik de afbeelding niet aanpassen maar alleen tijdelijk verkleind weergeven.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
                        System.Drawing.Image original = System.Drawing.Image.FromFile(imagePath);
                        float aspect = (float)original.Height / (float)original.Width;
                        int newWidth = 322;
                        int newHeight = (int)(newWidth * aspect);
                        Bitmap temp = new Bitmap(newWidth, newHeight, original.PixelFormat);
                        Graphics newImage = Graphics.FromImage(temp);
                        newImage.DrawImage(original, 0, 0, newWidth, newHeight);
                        temp.Save("FileName");    
                        temp.Save(outputFileName);

                        original.Dispose();
                        temp.Dispose();
                        newImage.Dispose();


Bij de eerste regel krijg ik al een FileNotFoundException, terwijl de lokatie toch echt klopt als ik er handmatig heenga.

Hoe kan ik dat het beste aanpakken? Wat hulp zal ik erg waarderen.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:02

TeeDee

CQB 241

• .FromFile zal iets als "C:\files\root\images\" etc. etc. moeten zijn. Relatieve paden vreet ie niet.
Ik heb wat zitten zoeken en ben tot dit stukje code gekomen maar dat wil ook niet echt werken:
Definieer "ook niet echt werken".
Bovendien wil ik de afbeelding niet aanpassen maar alleen tijdelijk verkleind weergeven.
Zoek/Kijk eens naar de temp.Save(Response.Outputstream....) (wat overigens gewoon in de Overload staat)

[ Voor 8% gewijzigd door TeeDee op 17-07-2008 16:08 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 17-02 21:20

.Gertjan.

Owl!

Als je een FileNotFoundException exception krijgt heeft je probleem waarschijnlijk niets te maken met het resizen zelf.

Dat je zegt dat een afbeelding bestaat omdat je zelf naar de locatie kunt gaan betekent niet dat ASP.NET erbij kan. Het proces dat websites/.net host draait op een ander gebruiker en die kan bijvoorbeeld ging rechten hebben op de map waar jij het over hebt.

Heb je ook al gekeken of het pad dat jij denkt dat gebruikt wordt ook echt wordt gebruikt? Staat in [imagePath] wel de goede locatie (en heb je er rekening mee gehouden dat je het \ char moet escapen naar \\)...

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


  • Kyoshi
  • Registratie: December 2006
  • Laatst online: 14-11 22:14
TeeDee schreef op donderdag 17 juli 2008 @ 16:04:
• .FromFile zal iets als "C:\files\root\images\" etc. etc. moeten zijn. Relatieve paden vreet ie niet.

Inderdaad. Krijg de Exception niet meer. Ben al een stap verder.

[...]
Definieer "ook niet echt werken".

Kreeg het niet aan de praat. Overigens niet meer van toepassing.

[...]

Zoek/Kijk eens naar de temp.Save(Response.Outputstream....) (wat overigens gewoon in de Overload staat)

Ik ga er naar kijken.

[ Voor 3% gewijzigd door Kyoshi op 17-07-2008 16:13 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21:24

gorgi_19

Kruimeltjes zijn weer op :9

Door de vaste breedtes krijg je wel dat de hoogtes alle kanten op schieten; leuk als je een plaatje van 20x100 gaat uploaden :+

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:02

TeeDee

CQB 241

Och, dat 'algorithme' kan TS zelf wel vinden met behulp van keywords: asp.net resize aspectratio :D

Heart..pumps blood.Has nothing to do with emotion! Bored


  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 17-02 21:20

.Gertjan.

Owl!

TeeDee schreef op donderdag 17 juli 2008 @ 19:05:
Och, dat 'algorithme' kan TS zelf wel vinden met behulp van keywords: asp.net resize aspectratio :D
Een formule/algorithme om een plaatje met behoud van aspectratio te verkleinen/vergroten naar een maximum width en height heeft niets echt iets met .net te maken, dus dat keyword kan hij weglaten

Het is gewoon een kwestie van kijken welke vergrotings/verkleinings factor je moet gebruiken.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
double ratio = 0;
int bestFitWidth = 0;
int bestFitHeight = 0;

ratio = width / maxWidth;
bestFitWidth = width * ratio;
bestFitHeight = height * ratio;

//If image does not fit in height when using maxwidth, use the maxheight (in this case the bestFitWidth will be less then the maxWidth)
if(bestFitHeight > maxHeight) 
{
 ratio = height / maxHeight;
 bestFitWidth = width * ratio;
 bestFitHeight = height * ratio;
}


Met bovenstaande code zou je de beste fit moeten kunnen krijgen. Je kunt namelijk ALTIJD of de width of de height op de max krijgen.

[ Voor 3% gewijzigd door .Gertjan. op 17-07-2008 22:16 . Reden: code language even goed gezet ]

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:02

TeeDee

CQB 241

.Gertjan. schreef op donderdag 17 juli 2008 @ 22:14:
[...]

Een formule/algorithme om een plaatje met behoud van aspectratio te verkleinen/vergroten naar een maximum width en height heeft niets echt iets met .net te maken, dus dat keyword kan hij weglaten
offtopic:
Dat weet jij, dat weet ik. TS heeft het dan helemaal in hapklare brokken, inclusief de syntax.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Kyoshi
  • Registratie: December 2006
  • Laatst online: 14-11 22:14
Bedankt iedereen, ik ga ermee aan de slag =)

  • labee
  • Registratie: November 2002
  • Laatst online: 10-09-2022
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    // Afbeeldingen resizen.
    private static Bitmap ResizeImageFile(Bitmap oldImage, int targetWidth) 
    {
      Size newSize = CalculateDimensions(oldImage.Size, targetWidth);
      Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb);
        using (Graphics graphic = Graphics.FromImage(newImage)) 
            {
                graphic.SmoothingMode      = SmoothingMode.AntiAlias;
              graphic.InterpolationMode  = InterpolationMode.HighQualityBicubic;
                graphic.PixelOffsetMode    = PixelOffsetMode.HighQuality;
                graphic.CompositingQuality = CompositingQuality.HighQuality;
                graphic.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize));
            return newImage;
      }
    }
      
      // Juiste afmetingen berekenden. De width is altijd gelijk. 
    private static Size CalculateDimensions(Size oldSize, int targetWidth) 
    {
          Size newSize   = new Size();
      newSize.Width  = targetWidth;
        newSize.Height = (int)(oldSize.Height * ((float)targetWidth / (float)oldSize.Width));
          return newSize;
      }

    // Een bestand resizen en uploaden.
    private static void UploadResizeFile(FileUpload fileUpload, string imagePath, int targetWidth)
    {
      // Afbeeldingen resizen.
      Bitmap image = ResizeImageFile(new Bitmap(fileUpload.PostedFile.InputStream), targetWidth);
      // Afbeeldingen opslaan.
      image.Save(imagePath, ImageFormat.Jpeg);
      image.Dispose();
    }

http://www.labee.nl

Pagina: 1