22. juli 2009 - 23:02Der er
22 kommentarer og 1 løsning
Fjerne noger af header i jpg filer
Hejsa E
For at gøre en kort historie lang, så har jeg fået mig en tvix og vil spille min musik på den. Jeg bruger iTunes og den henter covers til mine CD'ere. Dem vil jeg også gerne kunne se på Tvixen, men i iTunes hedder filerne xxx.itc2 og der er lagt nogle informationer ind forrest i headeren.
Det skulle sådan set være lige til (ifølge forskellige foraer) men det er endnu ikke lykkes helt for mig, så nu vil jeg lige høre om nogen kan få det til at fungere.
Selve jpg headeren starter ved HEX værdierne FFD8 FFE0, så i teorien skal man "bare" finde dem og fjerne det der står foran og omdøbe til jpg. Jeg har gjort mig et par noter, som jeg lige skriver på her, ved ikke om det er helt rigtigt...
Ifølge forskellige foraer skal man bruge en binaryreader, da konvertering til string er alt for langsomt. Når man læser værdierne læses de to og to, så man kan ikke være sikker på at fange dem med ReadUInt32, man må derfor bruge ReadUInt16 to gange.
Jeg tænker at man måske kan bruge substring eller regex til det.
Her er noget skrivebordskode til at illustrere hvordan jeg tror det kunne se ud:
private void removeiTunesHeader(string filename, string path) { bool found = false; int currentPosition = 0; FileStream fs = File.OpenRead(filename); BinaryReader br = new BinaryReader(fs); while (found == false && currentPosition <= br.Length) { UInt16 headerByte = br.ReadUInt16(); // Start of Image (SOI) marker (FFD8) currentPosition += headerByte.Length; if (headerByte == 0xd8ff) { UInt16 headerByte2 = br.ReadUInt16(); // JFIF marker (FFE0) if (headerByte2 == 0xe0ff) found = true; } }
Jeg håber nogen kan hjælpe mig med at få det til at virke. Kom med noget kode og ikke bare henvisninger, jeg har læst en masse på nettet og vil gerne videre nu.
Det ser fint ud, men der er umiddelbart to mindre issues:
1: Den skal træde to "skridt" tilbage, så den får "d8ff" og "e0ff" med i filen. 2: Det ser ud til at den overskriver filen, men den skal lave en ny med endelsen ".jpg" da jeg skal bruge originalen.
for det førstes vedkommende kan jeg så ikke bare skrive:
Jeg får en fejl ved FileStream fs2 = File.OpenRead(filename.Replace(".itc2", ".jpg")); om at den ikke kan finde filen. Skal den oprettes først som en tom fil eller noget ??
System.IO.FileNotFoundException: Could not find file 'D:\Mp3\iTunes\Album Artwork\Download\F738D7100A3D4B8A\00\15\10\F738D7100A3D4B8A-67DA11AB2F51BAF0.jpg'.
System.ArgumentException: The output char buffer is too small to contain the decoded characters, encoding 'Unicode (UTF-8)' fallback 'System.Text.DecoderReplacementFallback'.
Parameter name: chars
at System.Text.Encoding.ThrowCharsOverflow()
at System.Text.Encoding.ThrowCharsOverflow(DecoderNLS decoder, Boolean nothingDecoded)
namespace E { public class Program { public static void Convert(string fnm) { Stream istm = new FileStream(fnm, FileMode.Open, FileAccess.Read); Stream ostm = new FileStream(fnm.Replace(".itc2", ".jpg"), FileMode.Create, FileAccess.Write); byte[] b = new byte[65536]; int n; bool first = true; while((n = istm.Read(b, 0, b.Length)) > 0) { int ix = 0; if(first) { while(b[ix] != 0xFF && b[ix+1] != 0xD8 && b[ix+2] != 0xFF && b[ix+3] != 0xE0) { ix++; if(ix > n - 4) throw new Exception(fnm + " does not conatin a JPG file"); } first = false; } ostm.Write(b, ix, n - ix); } ostm.Close(); istm.Close(); } public static void Main(string[] args) { Convert(@"C:\coverart.itc2"); } } }
men men men - diverse simple billed læse programmer kan ikke læse resultatet. Kun HP Photosmart Premier kunne læse det - og viste det som 3 billeder: bluedot.png, code.png og coverart.jpg.
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.