Ich bin jetzt einfach mal der Meinung, dass du unter Windows programmierst (sah anhand deiner bisherigen Beiträge so aus).
Dadurch bietet sich dir natürlich noch die Möglichkeit, das Umwandeln mittels GDI+ zu machen. Dann schaffst du auf einmal das ganze Bild und kannst es danach ganz bequem mit steigenden Alpha-Werten über das farbige Bild legen.
So schaust du dann zwar nicht direkt beim Umwandeln zu, hast aber eine Art Einblendeffekt, also auch was zum zugucken.
Edit:
Folgendes Beispiel ist in Delphi geschrieben, verwendet aber die Klassen und Methoden aus GDI+, wie sie auch in jeder anderen Sprache verfügbar sind:
Code:
procedure ToGreyScale(filename:string);
var
Image:IGPBitmap;
HSL:IGPHueSaturationLightness;
HSLParams:TGPHueSaturationLightnessParams;
begin
Image := TGPBitmap.Create(filename);
HSL := TGPHueSaturationLightness.Create;
HSLParams.SaturationLevel := -100;
HSLParams.HueLevel := 0;
HSLParams.LightnessLevel := 0;
HSL.Parameters:=HSLParams;
Image.ApplyEffect(HSL);
Image.Save('Graustufen.jpg',TGPImageFormat.jpeg);
end;
Funktionsweise:
1. Das zu manipulierende Bild wird in das passende GDI+ Bitmap geladen. Die Vorlage muss dabei kein Bitmap sein. Statt - wie im Beispiel - mit einer Datei, kann auch mit einem Stream gearbeitet werden. Gleiches gilt beim Speichern.
2. Es wird ein Effekt angelegt, der 100% der Saturation vom Bild entfernen soll, während Hue und Lightness unverändert bleiben.
3. Der Effekt wird auf das Bitmap angewendet.
4. Das Bitmap wird (in diesem Fall als Jpeg, das Format ist natürlich auch austauschbar) gespeichert.
Wenn du aus einem Stream lädst und in einen Stream speicherst, sollte es relativ einfach sein, das ganze in dein Programm zu integrieren. Ich kenn mich mit C# aber zu wenig aus, um dir dafür entsprechende Vorlagen zu geben. Aber wenn dir Delphi nichts ausmacht:
Code:
procedure ToGreyScaleStream(Stream:IStream);
var
Image:IGPBitmap;
HSL:IGPHueSaturationLightness;
HSLParams:TGPHueSaturationLightnessParams;
begin
Image := TGPBitmap.Create(Stream);
HSL := TGPHueSaturationLightness.Create;
HSLParams.SaturationLevel := -100;
HSLParams.HueLevel := 0;
HSLParams.LightnessLevel := 0;
HSL.Parameters:=HSLParams;
Image.ApplyEffect(HSL);
Image.Save(Stream,TGPImageFormat.Bmp);
end;
procedure TForm2.Button1Click(Sender: TObject);
var
Stream:TStream;
begin
Stream := TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(Stream);
ToGreyScaleStream(TStreamAdapter.Create(Stream,soOwned) as IStream);
Stream.Position:=0;
Image2.Picture.Bitmap.LoadFromStream(Stream);
end;