Avatar billede brian-johansen Nybegynder
04. maj 2006 - 12:46 Der er 46 kommentarer og
1 løsning

IMAGE Resize problem

Hej,

Jeg har sådan at jeg loader en billede ind i imagebox. Billederne jeg loader ind er af forskellig størrelse så jeg ville gerne have at den Resize'ede dem når den henter dem.

Jeg fandt i spg. http://www.eksperten.dk/spm/550297, en løsning som jeg tror der virker.

Jeg har prøvet at tilpasse denne men hver eneste gang jeg henter den så laver den en Object not set to a instance.

koden ser sådan ud ( og den fejler der hvor jeg har sat en pil)


public partial class medarbejder : System.Web.UI.Page
{
    string side;
    OleDbConnection myConn;
    OleDbDataAdapter myCmd;
    protected const int WIDTH = 100;
    protected const int HEIGHT = 150;
    protected void Page_Load(object sender, EventArgs e)
    {
 

        if (!IsPostBack)
        {
            string strDSN = @"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
            strDSN += Server.MapPath("App_Data\\beck.mdb");
            myConn = new OleDbConnection(strDSN);
            side = Request.QueryString["side"];
            string query = "select * FROM brugere where navn= '" + side + " '";

           
            if (side == null)
            {

                myConn.Open();
                start.Visible = true;
                picBox.Visible = false;
                myConn.Close();

            }
            else
            {
                string path = "Img";
                start.Visible = false;
                picBox.Visible = true;
                myConn.Open();
                myCmd = new OleDbDataAdapter(query, myConn);
                DataSet ds = new DataSet();
                myCmd.Fill(ds, "brugere");
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                  path = dr["pic1"].ToString();
                }
               
                Bitmap bmp = ImageResizer.RezizeImage(path, WIDTH, HEIGHT);

                Response.ContentType = "image/jpeg";
  HER    -->  bmp.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                bmp.Dispose();

                Image1.ImageUrl = path;
                DataList1.DataSource = ds;
                DataList1.DataBind();

            }
            myConn.Close();
        }
       
    }
    public class ImageResizer
    {
        public static Bitmap RezizeImage(string filePath, int width, int height)
        {
            System.Drawing.Bitmap bmpOut = null;

            try
            {
                Bitmap bmp = new Bitmap(filePath);

                bmpOut = new Bitmap(width, height);
                Graphics g = Graphics.FromImage(bmpOut);
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.FillRectangle(Brushes.White, 0, 0, width, height);
                g.DrawImage(bmp, 0, 0, width, height);
                bmp.Dispose();
            }
            catch
            {
                return null;
            }

            return bmpOut;
        }
    }


Er der nogen der umiddelbart lige kan gennemskue hvad der går galt ?

mvh Brian
Avatar billede snepnet Nybegynder
04. maj 2006 - 13:09 #1
har du checket med debuggeren om du lander i den catch der er i imageresizeren... så får du null tilbage, hvilket så vil give dig fejlen.
mvh
Avatar billede brian-johansen Nybegynder
04. maj 2006 - 13:28 #2
Jo det ser ud som om den lander i catch'en ?

mvh
Avatar billede brian-johansen Nybegynder
04. maj 2006 - 13:30 #3
Men det overføre Path fint nok.
Avatar billede snepnet Nybegynder
04. maj 2006 - 13:39 #4
Hvilken exception får du?

Du kan evt. samle den op sådan her:

catch(Exception er)
{
  // her kan du så kigge på er
  string errorMessage = er.Message;
}

Hvis du sætter et breakpoint på linien:
string errorMessage = er.Message;
Kan du inspicere din exception når du lander der.

Bruger du VS2005 kan du bare holde musen over variablen er, kigge på forholdene.

Bruger du VS2003 kan du markere variablen og trykke SHIFT+F9 (virker også i 2005).

... Så kan du komme til at se hvad balladen er.

Mvh
Avatar billede brian-johansen Nybegynder
04. maj 2006 - 13:44 #5
Hej Jeg får:

Object reference not set to an instance of an object.

Jeg får bare at vide at bmp er null:

mvh
Avatar billede snepnet Nybegynder
04. maj 2006 - 13:55 #6
På hvilken linie falder fejlen... her?:
g.DrawImage(bmp, 0, 0, width, height);
mvh
Avatar billede snepnet Nybegynder
04. maj 2006 - 14:05 #7
Nej ... du skal kigge på klasssen ImageResizer. Hvis du lander i den catch der er i den, skal du finde ud af hvad det er der går galt der.
Den med at bmp er null må være fra din medarbejder-klasse (din side).
Sæt et breakpoint i metoden i resizeren, og step ned igennem koden og se hvad der sker.
mvh
Avatar billede brian-johansen Nybegynder
04. maj 2006 - 14:08 #8
Hej,
jeg prøver lige og jeg vender lige tilbage senenere, tak for svarende

mvh Brian
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 00:45 #9
Hej,

Jeg får fejl her:

Bitmap bmp = new Bitmap(filePath);

Filpath indeholder i mit tilfælde image/mbaction.jpg

Jeg kan se i min exception at der står parameter not valid.

mvh Brian
Avatar billede snepnet Nybegynder
05. maj 2006 - 08:21 #10
prøv at give den en fuld sti - eller benyt Server.MapPath(...) ... det er en virtuel sti du giver til bitmap-constructeren nu.
mvh
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 09:55 #11
Hej Snepnet
Nu har jeg skrevet sådan her:
Bitmap bmp = new Bitmap(System.Web.HttpContext.Current.Server.MapPath(filePath));

Men vi i stedet for at vise den på siden og i dens panel, så viser den kun billedet og intet andet.

mvh Brian
Avatar billede snepnet Nybegynder
05. maj 2006 - 10:22 #12
du skal lægge det med imagegenereringen på en side eller i en handler for sig (det sidste er at foretrække).
du skal så ende op med et img på siden, hvis src peger på den side/handler du har lavet der alene gemmer et billede i responsestream'en.
mvh
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 10:25 #13
okay... det var lidt mere advanceret end jeg lige havde regnet med. Har du et eksemple på dette ellers så må jeg lige en tur ud på google.com

mvh Brian
Avatar billede snepnet Nybegynder
05. maj 2006 - 10:37 #14
Det er ikke så avanceret som det lyder ... men du hænger på, at du ikke har andre mugliheder med et img-tag end at henvise til en url (som så formodes at være et billede).
Du får et eksempel lige om lidt.
Mvh
Avatar billede snepnet Nybegynder
05. maj 2006 - 11:15 #15
Du kan lige få et simpelt eksempel her:

// en imageserver (ImageServer.ashx)
<%@ WebHandler Language="C#" Class="ImageServer" %>

using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

public class ImageServer : IHttpHandler
{   
    public void ProcessRequest (HttpContext context)
    {
        string imageFolder = @"C:\testfiles";
        string imageFileName = context.Request.QueryString["imageFileName"];
        Bitmap bmp = new Bitmap(Path.Combine(imageFolder, imageFileName));
        context.Response.ContentType = "image/jpeg";
        bmp.Save(context.Response.OutputStream, ImageFormat.Jpeg);
        bmp.Dispose();
    }

    public bool IsReusable
    {
        get
        {
            return true;
        }
    }

}

// og en side der benytter den:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ImageServerUser.aspx.cs" Inherits="ImageServer_ImageServerUser" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:Image ID="Image1" runat="server" ImageUrl="~/ImageServer/ImageServer.ashx?imageFileName=tuba.jpg" />
    </form>
</body>
</html>

Håber det illustrerer det... Du skal så bare hive billedet ud af en database som du nu gør, og sikre dig at den parameter du overfører til handleren kan bruges til at finde billedet i basen.

Spørg løs hvis du ikke er med på den.

Mvh
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 11:22 #16
Ja jeg har da lige et lille et, hvordan laver jeg en imageserver i visuel web developer ?, er det bare en cs fil eller en webform eller hvordan ?

mvh Brian
Avatar billede snepnet Nybegynder
05. maj 2006 - 11:30 #17
Du kan bare oprette filen manuelt (og paste indholdet fra det jeg sendte).
Men ellers ville jeg da tro, at "Generic Handler" var at finde hvis du højreklikker på web'et i VWD og vælger "Add new item".
mvh
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 11:34 #18
Fandt Generic Handler :D
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 11:43 #19
Nu har jeg prøvet at skrive som du siger. Den compialer fint nok, men den viser ikke billedet.
Billedes url er: http://localhost:2196/becklaw/ImageServer/ImageServer.ashx?imageFileName=capimage.jpg

Jeg har i min kode fil skrevet sådan:

Image1.ImageUrl = "~/ImageServer/ImageServer.ashx?imageFileName=capimage.jpg";

Jeg har oprettet en mappe der hedder testfiles hvor jeg har sikkret mig at filen ligger.

mvh Bria

mvh Brian
Avatar billede snepnet Nybegynder
05. maj 2006 - 12:08 #20
sæt et breakpoint i handleren, og step ned igennem koden - så kan du se hvad der sker.
(du sætter et breakpoint med F9 - og stedder igennem koden med F10)
mvh
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 12:48 #21
Hej, jeg tror ikke den ved at den skal gå over i imageServer og kigge forbi hver gang jeg debugger så går den ikke over i den og stopper.

Jeg har både prøve at sætte et breakpoint i  public void ProcessRequest (HttpContext context) { og string imageFolder = @"C:\testfiles";

Men lige lidt hjælper det.

mvh Brian
Avatar billede snepnet Nybegynder
05. maj 2006 - 13:23 #22
Sæt dit breakpoint på første kodelinie i ProcessRequest-metoden.
Start dit web med F5
Mvh
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 13:29 #23
Du vil gerne have jeg starter den fra den side billedet bliver hentet ind ikke ?

Ellers så skriver den bare at imageFileName can not be null

Men hvis jeg sætter mit breakpoint i ProcessRequest-metoden, så sker der ingen ting ?


mvh Brian
Avatar billede snepnet Nybegynder
05. maj 2006 - 13:37 #24
Jo - du starter den fra den side hvor du benytter et billede der hentes via din handler.
Har du debug="true" i web.config?
Mvh
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 14:01 #25
Ja det skulle jeg da mene for hvis jeg sætter et breakpoint på en anden side så køre den  igennem sådan at jeg bare kan sidde og trykke på step hver gang.

Skal jeg lave nogen for for referencer ?

mvh Brian
Avatar billede snepnet Nybegynder
05. maj 2006 - 14:26 #26
Nej det skal virke umiddelbart...
Mvh
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 17:33 #27
Hummm det er godt nok mærkeligt har du nogen forslag til det ?

mvh Brian
Avatar billede snepnet Nybegynder
05. maj 2006 - 17:37 #28
Nøh... er stien til din imageserver.aspx helt korrekt? - altså.. Den ligger i en undermappe der hedder imageserver.
mvh
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 17:38 #29
Hehe ja nu kan man da ihvertfald tale om at se sig blid på tingene...

I bedste Homer Simpson Stil ... DOOOOH !!!!

Jeg havde skrevet et forkert Mappe navn

mvh
Avatar billede snepnet Nybegynder
05. maj 2006 - 17:38 #30
Og... kan jeg se den kode du bruger til at sætte billedet ind med nu?
Mvh
Avatar billede snepnet Nybegynder
05. maj 2006 - 17:39 #31
Fint nok - bare se bort fra det sidste jeg skrev :o)
Mvh
Avatar billede snepnet Nybegynder
05. maj 2006 - 17:39 #32
Funger det så nu?
Mvh
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 17:40 #33
Hvordan overføre jeg så hviklen fil jeg gerne vil have ?

Altså jeg trækker den jo ud af mit DataSet ? så jeg skal jo have den overført den til min ImageServer sådan jeg kan fortælle den hvad mit ImageFileName er ?

mvh Brian
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 17:43 #34
Ja den fungere fint nok med et statisk billede se evt min kommentar ovenfor.

Men skal jeg så ligge min Resize metode i ImageServer filen ?

mvh brian
Avatar billede snepnet Nybegynder
05. maj 2006 - 17:51 #35
Hvis du benytter f.eks. et GridView til at vise sagerne i - kan du fikse det med et databindingsudtryk - hvor du benytter et id ell. til at udlede hvad det er for et billede der skal hentes.
En typisk løsning kunne se sådan her ud:
<asp:ImageField DataImageUrlField="ImageId" DataImageUrlFormatString="ImageServer.ashx?ImageId={0}" HeaderText="Billede" />
Som så er en kolonne i dit GridView.
Mvh
Avatar billede snepnet Nybegynder
05. maj 2006 - 17:52 #36
Ja - i resizefilen, eller i en fil for sig i App_Code
Mvh
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 17:57 #37
Jeg bruger faktisk bare en PictureBox der ligger i et panel, panelet bliver kun vist hvis hvis min QueryString != null.

Hvis så bliver vidst så for den url, fra en DB via et dataset. Jeg henter den ind sådan:
foreach (DataRow dr in ds.Tables[0].Rows)
                {
                  path = dr["pic1"].ToString();
                }
Jeg henter også andre ting ind som jeg bruger på min side, men dem tilgår jeg via DataContainer.Eval("EnRække");
Path er så en string der bliver sat ligmed image1.imageurl.

mvh Brian
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 18:13 #38
Hey,
Jeg har skrevet det sådan:
<%@ WebHandler Language="C#" Class="ImageServer" %>

using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

public class ImageServer : IHttpHandler {
    protected const int WIDTH = 10;
    protected const int HEIGHT = 50;
    public void ProcessRequest (HttpContext context) {
        string imageFolder = @"C:\testfiles";
        string imageFileName = context.Request.QueryString["imageFileName"];
        Bitmap bmp = new Bitmap(Path.Combine(imageFolder, imageFileName));
        bmp = RezizeImage(imageFileName, WIDTH, HEIGHT);
        context.Response.ContentType = "image/jpeg";
        bmp.Save(context.Response.OutputStream, ImageFormat.Jpeg);
        bmp.Dispose();
    }
    public static Bitmap RezizeImage(string filePath, int width, int height)
        {
            System.Drawing.Bitmap bmpOut = null;

            try
            {
                Bitmap bmp = new Bitmap(filePath);

                bmpOut = new Bitmap(width, height);
                Graphics g = Graphics.FromImage(bmpOut);
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.FillRectangle(Brushes.White, 0, 0, width, height);
                g.DrawImage(bmp, 0, 0, width, height);
                bmp.Dispose();
            }
            catch (Exception er)
            {
                // her kan du så kigge på er
                string errorMessage = er.Message;

            }


            return bmpOut;
        }
   

    public bool IsReusable {
        get {
            return false;
        }
    }

}


Men jeg bliver ved med at få fejl her:

Bitmap bmp = new Bitmap(filePath);
bmpOut = new Bitmap(width, height);


Fejl er "not valid parameter", kan det være fordi den ikke kan finde billedet eller hvad ?

mvh Brian
Avatar billede snepnet Nybegynder
05. maj 2006 - 18:15 #39
ja - det kan det godt.
mvh
Avatar billede snepnet Nybegynder
05. maj 2006 - 18:21 #40
det her er jo blot et eksempel:

        string imageFolder = @"C:\testfiles";
        string imageFileName = context.Request.QueryString["imageFileName"];
        Bitmap bmp = new Bitmap(Path.Combine(imageFolder, imageFileName));

hvis du har en fuld sti i databasen - er det så også den du skal benytte når du loader billedet, og så skal den parameter du overføre indeholde den fulde sti, så det f.eks. bliver sådan her istedet:

        string fullImagePath = context.Request.QueryString["fullImagePath"];
        Bitmap bmp = new Bitmap(Path.Combine(imageFolder, fullImagePath));

og du skal så sætte dit Image's ImageUrl til
ImageServer.ashx?fullImagePath=path;
hvor path så er den stil du får fra databasen.

mvh
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 18:33 #41
jeg har en sti i min db der hedder images/xxx.jpg

Når jeg kalder imageserver.ashx hvordan sender jeg en querystring med ?

mvh brian
Avatar billede snepnet Nybegynder
05. maj 2006 - 18:49 #42
Som vist ovenfor:
ImageServer.ashx?fullImagePath=path;
din querystring er det der står efter ?
mvh
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 19:16 #43
Selvfølig! ja tak jeg kigger lige på det
Avatar billede brian-johansen Nybegynder
05. maj 2006 - 21:53 #44
SÅ ! Fik jeg det sgu til at virke... sådan da, for den for billedet til at pixilere samt  den får den ikke til at få de mål jeg beder den om.

mvh Brian
Avatar billede snepnet Nybegynder
06. maj 2006 - 01:58 #45
bliver de ikke 10*50...? - har du en side jeg kan se det på?
mvh
Avatar billede brian-johansen Nybegynder
08. maj 2006 - 09:33 #46
Hej, jeg fandt ud af det, det var lige en lille fejl på siden hvor de skulle vises.

Mange tak for hjælpen, ligger du lige et svar ?

mvh Brian
Avatar billede snepnet Nybegynder
08. maj 2006 - 10:50 #47
Kommer her :o)
Mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester