Richtiger Umgang mit IStream
-
Hi
Ich benütze folgenden Quelltext um die optimale Qualitätseinstellung für eine jpg-Datei in Abhängigkeit von der gewünschten Dateigröße zu ermitteln:
IStream *str=NULL; CreateStreamOnHGlobal(NULL, TRUE, &str); int upper=100; int under=0; int size=102400; int oldqual=0; _ULARGE_INTEGER a; a.LowPart=0; a.HighPart=0; _LARGE_INTEGER b; b.LowPart=0; b.HighPart=0; for(int i=0; i<7; i++) { quality=(upper+under)/2; if(quality==oldqual) break; oldqual=quality; encoderParameters.Parameter[0].Value = &quality; :arrow_right: str->SetSize(a); :arrow_right: str->Seek(b,STREAM_SEEK_SET,NULL); image->Save(str, &encoderClsid, &encoderParameters); STATSTG str_stat; str->Stat(&str_stat, STATFLAG_NONAME); if(str_stat.cbSize.LowPart > size) upper=quality; if(str_stat.cbSize.LowPart < size) under=quality; }Funktioniert soweit auch recht gut. Meine Frage bezieht sich auf die zwei markierten Zeilen.
Ist dies der korrekte Weg um einen IStream zu leeren oder sollte ich lieber etwas anderes verwenden?
Außerdem wollte ich noch fragen wie ich den Stream korrekt endgültig freigebe.Danke schonmal
gruß
rean
-
Der Stream ist leer von Beginn an. Die zwei Statements kannst Du entfernen.
-
Er muss ja aber bei jedem Schleifendurchlauf erneut geleert werden.
-
Oha! Das habe ich nicht übersehen. Aber dann hast Du es richtig gemacht.