AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi BMP Farbtiefe reduzieren ohne Farbverlust, Palettenzugriff
Thema durchsuchen
Ansicht
Themen-Optionen

BMP Farbtiefe reduzieren ohne Farbverlust, Palettenzugriff

Ein Thema von cyborg · begonnen am 19. Mär 2003 · letzter Beitrag vom 28. Jul 2010
Antwort Antwort
cyborg

Registriert seit: 15. Jan 2003
24 Beiträge
 
Delphi 7 Personal
 
#1

BMP Farbtiefe reduzieren ohne Farbverlust, Palettenzugriff

  Alt 19. Mär 2003, 00:20
Hallo Leute.

Ich will die Farbtiefe eines Bildes reduzieren aber wenn ich so vorgehe:

Bitmap.Pixelformat:=pf8bit;

habe ich zwar ein 256 Farben Bitmap, aber es gehen Farben verloren - obwohl die andere Bitmap (Format 32bit, 24bit u.a., das soll variabel sein, also auch mit 16 -> 256 und 256 -> 256 funktionieren!) insgesamt nicht mehr als 256 Farben hat!

Ich glaube da muss man die Palette optimieren.
Aber ich hab keine Ahnung wie das funktionieren soll...

leider finde ich keine eigenschaft in bmp, die mir einen (x,y) zugriff auf alle Paletteneinträge gibt, sonst könnte ich einfach die ersten 256 farben die ich im bitmap finde in ein array speichern (falls nicht schon drin) und hätte damit eine fertige palette.
das würde dann nur dann nicht funktionieren, wenn es mehr als 256 Farben in der bitmap gibt. aber das ist mir ja egal!
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#2
  Alt 19. Mär 2003, 15:42
Du kannst die Bitmap ja mit CreateDIBSection (Windows-API) erstellen. Da kannst du dir die Farben wie du vorhast in ein Array packen. Wenn es dir nur um das Abspeichern der neuen Bitmap geht, reicht es sogar, die Bitmap gemäß dem PSDK-Artikel "Bitmap Storage" von Hand zu speichern.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
cyborg

Registriert seit: 15. Jan 2003
24 Beiträge
 
Delphi 7 Personal
 
#3
  Alt 22. Mär 2003, 23:23
Okay, nachdem die Hilfe nicht besonders viel gebracht hat (ich versuche die API soweit wie möglich nur im notfall zu benutzen, sonst könnt ich genauso C++ verwenden) habe ich es dennoch mit einem trick geschafft...:

frei nach meiner funktion wie ich es mache
Delphi-Quellcode:
//datentypen:
// BitmapXXbit = Bitmap mit 24, 32 usw. Bit
// Bitmap8Bit = Bitmap mit 256 Farben
// JPG = TJPegImage (uses jpeg!!) als utility
// Reduzieren der Bitmap Qualität mit dem Palette Optimizing von JPEG
Function BMPReduceTo8Bit(BitmapXXBit: TBitmap): TBitmap;
VAR
JPG: TJPegImage;
Bitmap8bit: TBitmap;

Begin
IF BitmapXXBit<>nil then begin
  JPG:=TJpegImage.Create;
  JPG.CompressionQuality:=100; // <--damit die bitmap nicht komprimiert wird
  JPG.Assign(BitmapXXBit); //<- BitmapXXBit -> JPG

  JPG.JPEGNeeded; // <-- verwandle in JPEG!
  JPG.PixelFormat:=jf8bit; // 8 bit reduzierung
  JPG.DibNeeded; // palette wird neu geschrieben, wieder bitmap fähig

  bitmap8bit:=TBitmap.Create;
  bitmap8bit.PixelFormat:=pf8bit;
  bitmap8bit.Assign(JPG); // JPG (8bit,opt.palette) -> BMP (8bit)
// bitmap8bit.SaveToFile('whatever.bmp'); <-speichern

  JPG.Free;
  
  Result:=Bitmap8Bit;
end; // if %Bmp ned nil
end; // Proc %bmp8bit
  Mit Zitat antworten Zitat
Benutzerbild von MisterNiceGuy
MisterNiceGuy

Registriert seit: 1. Jul 2003
Ort: Mannheim
919 Beiträge
 
Delphi 7 Personal
 
#4

AW: BMP Farbtiefe reduzieren ohne Farbverlust, Palettenzugriff

  Alt 28. Jul 2010, 13:17
Guter Tipp, danke
Jonas
Wenn mich jemand sucht, ich bin im Kühlschrank!

Informationen über das Duale Studium
www.jofre.de
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: BMP Farbtiefe reduzieren ohne Farbverlust, Palettenzugriff

  Alt 28. Jul 2010, 14:11
Ist allerdings mit Vorsicht zu genießen, da JPEG auf Qualität 100 nicht verlustfrei ist. Man muss mindestens mit den Rundungsfehlern durch das Hin- und Rücktransformieren in den anderen Farbraum, und den Frequenzraum rechnen, Farbunterabtastung findet, soweit nicht anders explizit gewählt, auch statt, und es wird auch auf 100 noch quantisiert.
Der Fehler fällt i.A. zwar sehr gering aus, und ist so gut wie nie wahrnehmbar, aber wenn man Exaktheit benötigt, ist das o.g. Verfahren ungeeignet. Gerade bei 8Bit Bitmaps ist JPEG so eine Sache, da die scharfen Kanten zwischen den Farben genau das sind, was JPEG als "loss" hin nimmt. Kommt noch Dithering ins Spiel, wird's ganz ekelig.

Der Weg über die API scheint mir in allen Belangen überlegen zu sein.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz