AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Bitmaps

Ein Thema von eddie11 · begonnen am 5. Sep 2014 · letzter Beitrag vom 10. Sep 2014
Antwort Antwort
Seite 1 von 2  1 2      
eddie11

Registriert seit: 8. Nov 2005
Ort: Zossen bei Berlin
236 Beiträge
 
Delphi XE8 Professional
 
#1

Problem mit Bitmaps

  Alt 5. Sep 2014, 11:18
Hi allerseits,

ich habe ein TImage mit einem einfarbigen Bild. Die Farbe möchte ich beliebig ändern können. Dazu benutze ich die folgende Prozedur:
Code:
procedure TForm1.setzeBitmapFarbe(BitMap: TBitmap; NeueFarbe:TAlphaColor);
var
  BitmapData: TBitmapData;
  Pixel: PAlphaColor;
  I, J: Integer;
begin
  if Bitmap.Map(TMapAccess.ReadWrite, BitmapData) then begin
    for J := 0 to Bitmap.Height - 1 do begin
      Pixel := BitmapData.GetScanline(J);
      for I := 0 to Bitmap.Width - 1 do begin
        if (TAlphaColorRec(Pixel^).R <>0)
        or (TAlphaColorRec(Pixel^).G <>0)
        or (TAlphaColorRec(Pixel^).B <>0) then begin
          Pixel^ := NeueFarbe;
        end;
        Inc(Pixel);
      end
    end;
    Bitmap.Unmap(BitmapData);
  end;
end;
Das funktioniert auch wunderbar unter WIN32. Auf dem iPad und auch auf dem Simulator sind aber rot und blau vertauscht. Woran kann das denn liegen?
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

Die Kontramedüse ist verdrupelt!!!
  Mit Zitat antworten Zitat
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: Problem mit Bitmaps

  Alt 5. Sep 2014, 12:40
Das liegt daran das rot und blau vertauscht sind

Jetzt mal Spaß beiseite: Bei mehrkanaligen Bildern ist keine Konvention zwingend vorgegeben (Reihenfolge der Kanäle "RGB" oder "BGR"; "ARGB" oder "RGBA").
D.h. vorher auswerten.

Edit:

http://docwiki.embarcadero.com/Libra...es.TAlphaColor

TAlphaColor: ABGR
Chris

Geändert von Photoner ( 5. Sep 2014 um 12:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Problem mit Bitmaps

  Alt 5. Sep 2014, 12:57
Ich bin jetzt kein Firemonkey-Experte aber wenn das Bild quasi nur eine einfarbige Fläche ist dann
kannst du doch auch einfach Canvas.FillRect (o.ä.) benutzen statt über Scanline jeden Pixel selbst umzusetzen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
eddie11

Registriert seit: 8. Nov 2005
Ort: Zossen bei Berlin
236 Beiträge
 
Delphi XE8 Professional
 
#4

AW: Problem mit Bitmaps

  Alt 5. Sep 2014, 13:04
Bei mehrkanaligen Bildern ist keine Konvention zwingend vorgegeben (Reihenfolge der Kanäle "RGB" oder "BGR"; "ARGB" oder "RGBA").
D.h. vorher auswerten.

Edit:

http://docwiki.embarcadero.com/Libra...es.TAlphaColor

TAlphaColor: ABGR
hmmm... as verstehe ich jetzt nicht so ganz, was ist zu tun?
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

Die Kontramedüse ist verdrupelt!!!
  Mit Zitat antworten Zitat
eddie11

Registriert seit: 8. Nov 2005
Ort: Zossen bei Berlin
236 Beiträge
 
Delphi XE8 Professional
 
#5

AW: Problem mit Bitmaps

  Alt 5. Sep 2014, 13:05
Ich bin jetzt kein Firemonkey-Experte aber wenn das Bild quasi nur eine einfarbige Fläche ist dann
kannst du doch auch einfach Canvas.FillRect (o.ä.) benutzen statt über Scanline jeden Pixel selbst umzusetzen.
es ist eben keine Fläche, sondern ein einfarbiges Bild, ein einfarbiges Symbol, Icon
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

Die Kontramedüse ist verdrupelt!!!
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Problem mit Bitmaps

  Alt 5. Sep 2014, 13:08
Achso, ok dann geht das natürlich nicht.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
pelzig
(Gast)

n/a Beiträge
 
#7

AW: Problem mit Bitmaps

  Alt 5. Sep 2014, 13:26
Hi allerseits,

ich habe ein TImage mit einem einfarbigen Bild...
Einfarbiges Bild? Was ist - außer der einen Farbe - denn zu sehen?

SCNR

MfG
  Mit Zitat antworten Zitat
eddie11

Registriert seit: 8. Nov 2005
Ort: Zossen bei Berlin
236 Beiträge
 
Delphi XE8 Professional
 
#8

AW: Problem mit Bitmaps

  Alt 5. Sep 2014, 13:34
[QUOTE=pelzig;1271207]
Einfarbiges Bild? Was ist - außer der einen Farbe - denn zu sehen?
na gut, "einfarbig" ist vielleicht nicht der richtige Ausdruck. Es ist ein PNG mit transparentem Hintergrund und einem einfarbigen ICON darauf.
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

Die Kontramedüse ist verdrupelt!!!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Problem mit Bitmaps

  Alt 5. Sep 2014, 13:44
Es gibt halt bei der Byte-Order einen Unterschied ob es sich um ein BigEndian oder LittleEndian Betriebssystem handelt.

http://en.m.wikipedia.org/wiki/RGBA_...GBA_byte_order
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Problem mit Bitmaps

  Alt 5. Sep 2014, 15:34
Hallo,

Hab mal etwas probiert. So ginge es auch:

Delphi-Quellcode:
function GenerateBitmapMask(ABitmap: TBitmap; AMaskColor: TAlphaColor = TAlphaColorRec.White): PByteArray;
var Data: TBitmapData;
    Scan: PAlphaColorRec;
    i,j: Integer;
begin
  Result := ABitmap.CreateMask;

  ABitmap.Map(TMapAccess.maRead, Data);
  try
    for i := 0 to ABitmap.Height-1 do
    begin
      Scan := Data.GetScanline(i);
      for j := 0 to ABitmap.Width-1 do
      begin
        if AMaskColor = TAlphaColor(Scan^) then
          Result[i*ABitmap.Width+j] := 255
        else
          Result[i*ABitmap.Width+j] := 0;

        Inc(Scan);
      end;
    end;
  finally
    ABitmap.Unmap(Data);
  end;
end;

procedure SetBitmapColor(ABitmap: TBitmap; AColor: TAlphaColor; AMask: PByteArray = nil);
begin
  ABitmap.Clear(AColor);
  if Assigned(AMask) then
    ABitmap.ApplyMask(AMask);
end;

procedure TForm3.Button1Click(Sender: TObject);
var mask: PByteArray;
begin
  mask := GenerateBitmapMask(Image1.Bitmap{, TAlphaColorRec.White});
  try
    SetBitmapColor(Image1.Bitmap, TAlphaColorRec.Coral, mask);
  finally
    Dispose(mask);
  end;
end;
Musst dann halt die entspechende Maskenfarbe übergeben. In meinem Test wars einfach weiß.
Du hast ja echte Transparenz.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 5. Sep 2014 um 15:40 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:41 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