8bit 256graustufen bitmap erstellen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
A-KI
Beiträge: 16
Registriert: Do 20. Jan 2011, 00:12

8bit 256graustufen bitmap erstellen

Beitrag von A-KI »

hallo

wie aus der überschrift schon hervorgeht möchte ich ein 8bit bmp mit 256 graustufen erstellen und dieses dann als png abspeichern.

unter delphi gibt es die funktion "PixelFormat:=pf8bit" die es hier nicht gibt.

kann mir jemand weiterhelfen oder ein tipp geben wie womit es am besten und schnellsten geht???


schonmal danke für eventuelle hilfen
Lazarus 1.0.14
FPC 2.6.2
unter Win7 64bit/Ubuntu 64bit

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: 8bit 256graustufen bitmap erstellen

Beitrag von MAC »

Image1.Picture.Bitmap.PixelFormat:=pf8bit;
???

Aber du kannst auch ein 32 Bit Bitmap erstellen und dort halt nur grau draufmalen und dann
Image1.Picture.SavetoFile('irgendwas.png');

Code: Alles auswählen

Signatur := nil;

Benutzeravatar
theo
Beiträge: 10858
Registriert: Mo 11. Sep 2006, 19:01

Re: 8bit 256graustufen bitmap erstellen

Beitrag von theo »

MAC hat geschrieben: Aber du kannst auch ein 32 Bit Bitmap erstellen und dort halt nur grau draufmalen und dann
Image1.Picture.SavetoFile('irgendwas.png');
Das geht zwar schon, erstellt aber kein 8bpp sondern ein 24bpp PNG.
Wenn er wirklich eine 8bpp Datei braucht, kann OpBitmap helfen. Sonst geht's natürlich auch so.

A-KI
Beiträge: 16
Registriert: Do 20. Jan 2011, 00:12

Re: 8bit 256graustufen bitmap erstellen

Beitrag von A-KI »

ok hab mir mal opbitmap besorgt und folgenden code ausgeführt

Code: Alles auswählen

var
  bit: topbitmap;
  bx, by, i: integer;
begin
  bit := topbitmap.Create;
  bit.Height := 100;
  bit.Width := 100;
  bit.PixelFormat := pf8bit;
  i   := 0;
 
  for bx := 0 to bit.Height - 1 do
  begin
    for by := 0 to bit.Width - 1 do
    begin
      bit.Pixels[bx, by] := i;
      Inc(i);
      if i = 255 then
        i := 0;
    end;
  end;
 
  bit.SaveToFile('c:\testt.png');
  bit.Free;
er speichert zwar ab, aber ich kann die datei nicht öffnen bzw. habe auch keine vorschau?!?
Lazarus 1.0.14
FPC 2.6.2
unter Win7 64bit/Ubuntu 64bit

Benutzeravatar
theo
Beiträge: 10858
Registriert: Mo 11. Sep 2006, 19:01

Re: 8bit 256graustufen bitmap erstellen

Beitrag von theo »

Die Klasse TOpBitmap kann kein Bildformate, nimm TOPPicture ( uses ... opbitmap, opbitmapformats; )

Code: Alles auswählen

var OPP: TOPPicture;
  var i, bx, by:integer;
begin
  OPP:=TOPPicture.Create;
  OPP.Bitmap.Width:=100;
  OPP.Bitmap.Height:=100;
  OPP.Bitmap.PixelFormat:=opbitmap.pf8bit;
  OPP.Bitmap.ColorTable:=@Gray256Colors; //Grau Palette einhängen. 8bit ist nicht automatisch grau.
  i:=0;
  for bx := 0 to OPP.Bitmap.Height - 1 do
  begin
    for by := 0 to OPP.Bitmap.Width - 1 do
    begin
      TBitmapData8(OPP.Bitmap.Data).NativePixels[bx, by] := i; //statt die Farbe TColor direkt den Palettenindex setzen.
      Inc(i);
      if i = 255 then
        i := 0;
    end;
  end;
  OPP.SaveToFile('c:\testt.png');
  OPP.Free;
end;
Aber vielleicht erklärst du uns besser erst, was du genau willst. Vielleicht geht das auch viel einfacher.
Muss das Bild in Memory 8bit haben? In der Datei? Oder willst du nur einfach ein Bild aus Grauwerten erstellen?

A-KI
Beiträge: 16
Registriert: Do 20. Jan 2011, 00:12

Re: 8bit 256graustufen bitmap erstellen

Beitrag von A-KI »

thx das klappt

und wie kann ich den palettenindex der einzelnen pixel auslesen??

mit

Code: Alles auswählen

bitmap: toppicture;
 
begin
oop:= toppicture.Create;
 oop.LoadFromFile('c:\10000.png');
 
 showmessage(inttostr(oop.Bitmap.Pixels[0,0]));
bekomme ich den tcolorwert
Lazarus 1.0.14
FPC 2.6.2
unter Win7 64bit/Ubuntu 64bit

Benutzeravatar
theo
Beiträge: 10858
Registriert: Mo 11. Sep 2006, 19:01

Re: 8bit 256graustufen bitmap erstellen

Beitrag von theo »

Öhm, einfach umgekehrt?

Code: Alles auswählen

if OPP.Bitmap.PixelFormat=opbitmap.pf8bit then
Idx:=TBitmapData8(OPP.Bitmap.Data).NativePixels[bx, by];
P.S. Vielleicht erklärst du uns mal, was dein eigentliches Ziel ist. Vielleicht geht das viel einfacher.
S.a: http://www.tty1.net/smart-questions_de.html#goal" onclick="window.open(this.href);return false;

Antworten