Avatar billede koppelgaard Praktikant
05. november 2007 - 20:00 Der er 9 kommentarer og
1 løsning

Gemme kommentarer til et billede

Hej alle!
Jeg har lavet en lille imagebrowser, hvori jeg kan se mine digitale billeder.

Jeg vil gerne kunne gemme oplysninger om billederne, således at jeg - når jeg har hentet dem ind i min browser - kan se de bemærkninger, jeg har lavet til det enkelte billede.

Jeg tænkte, at man kunne gemme oplysningerne i det dokumeninfo, som hører til billedet - altså det man kan se, når man i en filebrowser højreklikke på billedet.

Er der nogen, der kan hjælpe mig med det ?
Avatar billede happycow Nybegynder
07. november 2007 - 18:58 #1
Ganske fornuftig idé faktisk. Det er ikke lykkedes mig at fremsøge noget sådan lige -- Men det vil da bestemt spare dig en masse møje og besvær med at logge info om filerne -- når informationen holdes atomart.
Avatar billede koppelgaard Praktikant
09. november 2007 - 12:50 #2
Rart at nogen kan se ideen i det :-) Og man må sku' ku'

:-)Michael
Avatar billede nielle Nybegynder
09. november 2007 - 18:27 #3
Det kan man sikkert også.

Der er blot et problem med documentinfo:

1) Enten er det en egenskab som er indbygget i selve filen (f.eks. i et Word dokument),
2) eller det er en egenskab som Windows operativsystemet vedligeholder for dig.

I tilfælde 2) kan du ikke være sikker på at documentinfo følger med når filen flyttes.

Heldigvis hører billeder (i det mindste jpeg-filer) til den første type. Selv om det hedder documentinfo i Windwos grænsefladen, skal man dog ikke lade sig narre idet det dette blot er for at præsentere brugeren med en ensartet brugergrænseflade; et andet navn for det samme er EXIF-headeren.

Der er efterhånden en del C# (eller generelt -Net) eksempler som viser hvordan man arbejder med denne. F.eks.:

http://www.eggheadcafe.com/articles/20030706.asp


PS: I virkeligheden viser documentinfo-tabben i Windows kun en lille del af de informationer man kan finde i EXIF-headeren.
Avatar billede koppelgaard Praktikant
12. november 2007 - 12:31 #4
Jeg havde helt opgivet at få et svar. Derfor satte jeg mig selv ned, og det lykkedes mig at få få skrevet kode der nogenlunde svarer til det link du gav mig.

Imidlertid var mine settlings der ikke da jeg flyttede billederne til vista med mit UBS-stik.  De var på med på UBS-stikket. Måske Vista blot ikke kan vise det?
Jeg vender tilbage. Senere.
Under alle om stændigheder tak for din hjælp indtil nu.

Michael
Avatar billede koppelgaard Praktikant
12. november 2007 - 20:07 #5
Suverænt Nielle!

Jeg har lige prøvet :
private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for(j = 0; j < encoders.Length; ++j)
{
if(encoders[j].MimeType == mimeType)
return encoders[j];
} return null;
}

private void WriteNewDescriptionInImage(string Filename,string NewDescription)
{
Image Pic;
PropertyItem[] PropertyItems;
byte[] bDescription=new Byte[NewDescription.Length];
int i;
string FilenameTemp;
System.Drawing.Imaging.Encoder Enc = System.Drawing.Imaging.Encoder.Transformation;
EncoderParameters EncParms=new EncoderParameters(1);
EncoderParameter EncParm;
ImageCodecInfo CodecInfo=GetEncoderInfo("image/jpeg");

// copy description into byte array
for (i=0;i<NewDescription.Length;i++) bDescription[i]=(byte)NewDescription[i];

// load the image to change
Pic=Image.FromFile(Filename);

// put the new description into the right property item
PropertyItems=Pic.PropertyItems;
PropertyItems[0].Id=0x010e; // 0x010e as specified in EXIF standard
PropertyItems[0].Type=2;
PropertyItems[0].Len=NewDescription.Length;
PropertyItems[0].Value=bDescription;
Pic.SetPropertyItem(PropertyItems[0]);

// we cannot store in the same image, so use a temporary image instead
FilenameTemp=Filename+".temp";

// for lossless rewriting must rotate the image by 90 degrees!
EncParm=new EncoderParameter(Enc,(long)EncoderValue.TransformRotate90);
EncParms.Param[0]=EncParm;

// now write the rotated image with new description
Pic.Save(FilenameTemp,CodecInfo,EncParms);

// for computers with low memory and large pictures: release memory now
Pic.Dispose();
Pic=null;
GC.Collect();

// delete the original file, will be replaced later
System.IO.File.Delete(Filename);

// now must rotate back the written picture
Pic=Image.FromFile(FilenameTemp);
EncParm=new EncoderParameter(Enc,(long)EncoderValue.TransformRotate270);
EncParms.Param[0]=EncParm;
Pic.Save(Filename,CodecInfo,EncParms);

// release memory now
Pic.Dispose();
Pic=null;
GC.Collect();

// delete the temporary picture
System.IO.File.Delete(FilenameTemp);
}

og hentede data ud med



        {
            Encoding enc = new ASCIIEncoding();
         
            Image image = Image.FromFile(@"c:\pic\DSCN0078.JPG");
           
   
            foreach (PropertyItem pi in image.PropertyItems){
                if (pi.Id == 0x010e) MessageBox.Show(enc.GetString(pi.Value));   
               
            }
            w.Close();                       
         
            }
   

Imidlertid bliver filstørrelsen lidt mindre den første gang man tilføjer en kommentar:
1.495.877 mod før 1.520.323
Når gentager procedure 100 gange bliver billedestørrelsen dog ikke yderlige formindsket.

Men kan du give en forklaring på det Nielle ?

Jeg skal bare være helt sikker på, at jeg ikke forringer mine billeder.

Michael
Avatar billede nielle Nybegynder
12. november 2007 - 20:36 #6
Bliver billedet også ved med at fylde mindre og mindre når du gentager handlingen?

Nu er det jo ikke mig som har skrevet koden så jeg kan kun gætte. Umiddelbart vil jeg tro at EXIF headeren fylder noget og at der er fordi at der indvindes noget spilplads fra denne at billedet kommer til at fylde mindre i sidste ende.

Artiklen påstår selv at algoritmen er lossless, og du kan som sagt heller ikke selv se nogen forringelse, så jeg tror at den holder. :^)
Avatar billede koppelgaard Praktikant
13. november 2007 - 09:04 #7
Jeg kørte en løkke, hvor jeg skev 100 gange til exif. Billedet blev kun mindre den 1. gang.
Blev forresten nødt til at rette:
Encoder Enc=Encoder.Transformation;
til
System.Drawing.Imaging.Encoder Enc = System.Drawing.Imaging.Encoder.Transformation;

Men det betyder vel ikke noget ?

Hvad skal lossless oversættes som ?

Du må hellere sende et svar.
Hvis jeg ikke havde viste det med billedeforringelsen så havde det været nogt L...

Michael

Michael
Avatar billede nielle Nybegynder
13. november 2007 - 16:37 #8
Du kunne også bare have tilføjet:

using System.Drawing.Imaging;

i toppen af din kode. Nej det betyder ikke noget - det er akkurat den samme kode der kommer ud af det. :^)

"lossless" = "tabsløst"

... og et svar :)
Avatar billede koppelgaard Praktikant
14. november 2007 - 18:31 #9
Jeg har netop stødt på nye problemer.
Jeg har derfor oprette et nyt sprøgsmål.
Der er noget jeg ikke forstår.

JEG HAR FULGT DIT RÅD OG OPRETTE EN KLASSE MED FILEINFO OG IMAGE MEN når jeg forsøger at rotere billedet under denne klasse for jeg at vide at der er et forkert argument.
Så ved rotering har jeg forsøgsvis hoppet et skridt tilbage og roteret pictureboxens image (det kan jeg godt) og derefter sat klassen imageproperty = picturebox.image( det kan jeg også godt).
Men når jeg så skal gemme, billedet under pictureboxen kommer der en fejl. mange til den fejl som jeg får i eksemplet jeg har lagt i det nye spørgsmål.
Avatar billede nielle Nybegynder
16. november 2007 - 20:06 #10
Hvil ikke lifo's råd (i det nye spørgsmål) hjælper skal jeg gerne kigge nærmere på det. :^)
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