Einzelnen Beitrag anzeigen

changlee
(Gast)

n/a Beiträge
 
#1

Graphics32: trotz Runterskalierung größere Datei. Was nun???

  Alt 21. Aug 2008, 17:06
Hallo,

ich Ich lade einen Screenshot in ein normales TBitmap und erhalte nach dem Abspeichern als *.bmp eine Dateigröße von 3 MB.
Wandele ich das TBitmap in ein TPNGObject (mit der freien Bibliothek PNGImage) um, erhalte ich eine Dateigröße von 313 kB.

Das ist mir noch zu groß. Also ging ich noch einen anderen Weg. Hier im Forum fand ich Empfehlungen zu Graphics32 für Skalirung mit sehr wenig Qualitätsverlust.

Ich lade jetzt also den Screenshot gleich in ein TBitmap32 und skaliere das mit dem Faktor 0.8.
Anschließend lade ich das TBitmap32 in ein TBitmap um es schließlich wieder zu png konvertieren zu können. Die png-Datei hat aber nun 354 kB. Also mehr als im unskalierten Fall.

Weiß jemand, woran es liegt und wie ich die Dateigrößen besser reduzieren kann (ohne den drastischen Qualitätsverlust von Stretchdraw zu erhalten)?

Hier ist der Quellcode der beiden Funktionen:
Delphi-Quellcode:

procedure CaptureScreen;
var
  DC: HDC;
  mypng:TPNGObject;
  Bitmap:TBitmap;
begin
  // Capture the Desktop screen
  DC := GetDC(GetDesktopWindow);
  Bitmap := TBitmap.Create;
  mypng:=TPNGOBJect.create;
  try
    Bitmap.Width := GetDeviceCaps(DC, HORZRES);
    Bitmap.Height := GetDeviceCaps(DC, VERTRES);
    BitBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,DC,0,0,SRCCOPY);
    Bitmap.SaveToFile('normalBitmap.bmp');
    mypng.Assign(Bitmap);
    mypng.SaveToFile('normalPng.png');
  finally
    ReleaseDC(GetDesktopWindow, DC);
    Bitmap.Free;
    mypng.Free;
  end;
end;


procedure CaptureScreen32;
var
  DC: HDC;
  mypng:TPNGObject;
  Bitmap,b,SmallBitmap:TBitmap32;
  bmap:TBitmap;
  resmplr: TKernelResampler;
  scalefactor : double;
  x,y:integer;
begin
  // Capture the Desktop screen
  DC := GetDC(GetDesktopWindow);
  Bitmap := TBitmap32.Create;
  try
    Bitmap.Width := GetDeviceCaps(DC, HORZRES);
    Bitmap.Height := GetDeviceCaps(DC, VERTRES);
    BitBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,DC,0,0,SRCCOPY);
  finally
    ReleaseDC(GetDesktopWindow, DC);
  end;
  scalefactor := 0.8;
  x := round(Bitmap.Width*scalefactor);
  y := round(Bitmap.Height*scalefactor);
  b := TBitmap32.Create;
  SmallBitmap := TBitmap32.Create;
  bmap:=TBitmap.Create;
  mypng:=TPNGOBJect.create;
  try
    resmplr := TKernelResampler.Create(b);
    resmplr.Kernel := TLanczosKernel.Create;
    SmallBitmap.SetSize(x,y);
    resmplr.Resample(SmallBitmap,rect(0,0,x,y),rect(0,0,x,y),Bitmap,rect(0,0,Bitmap.Width,Bitmap.Height),dmOpaque,nil);

    SmallBitmap.SaveToFile('reduced.bmp');

    bmap.Width := smallbitmap.Width;
    bmap.Height := smallbitmap.Height;
    bmap.Assign(Smallbitmap);

    mypng.Assign(bmap);
    mypng.SaveToFile('reduced.png');
  finally
    b.free;
    Bitmap.free;
    SmallBitmap.free;
    bmap.free;
    mypng.free;
  end;
end;
  Mit Zitat antworten Zitat