Deutsch
Forum

256-Farben Bitmap bearbeiten

 

Rainer
Hoefs
Hallo zusammen,

ich muß indizierte 256-Farben Bitmaps, also mit eigener Palette, bearbeiten und benötige dazu Hilfe.

Bitmap wird in den Speicher geladen.

Davon wird eine Kopie erstellt die um einen entsprechenden Bereich rechts erweitert wird.

Auf dem angefügten Bereich wird ein Rectangle gemalt mit dem Palettenindex 249.

Dann werden darauf einige Linien mit bestimmten Palettnnummer gezogen werden.

Danach wird die Bitmap durchsucht, y-Linie für y-Linie jeweils von links nach rechts. Jedes Pixel wird auf die Farbnummer geprüft, wird eine vorher festgelegte Farbnummer gefunden wird im neuen Bereich auf gleicher y-Linie ein entsprechender Punkt gesetzt, usw.

Das ganze habe ich bereits als Macro in einem Grafikprogramm (Grafx2) mit Lua geschrieben und funktioniert dort einwandfrei.

Ich möchte aber das gleiche Programm als selbständige Profan-EXE haben um es auch ohne Grafx2 benutzen zu können.

Was mir jetzt fehlt sind die entsprechenden Funktionen in Profan:

Palettennummer% = Getpixel(X,Y)
SetPixel(x ,y, Patettennummer%)
Line(x1, y1, x2, y2, Palettennummer%)
Rectangle(x1, y1, x2, y2, Palettennummer%)

Wer hat da einen Tip, oder soetwas schon mal gemacht und kann mir einen Tip geben.

Vielen Dank im voraus
Rainer
 
03.05.2019  
 




H.Brill
GetPixel und SetPixel gibt es doch schon.
Ich gehe mal davon aus, daß mit Palettennummer%
ein Farbwert gemeint ist.
Line hat zwar keinen Farb-Parameter, aber den
kann man ganz einfach mit UsePen vorher einstellen.
Und mit UseBrush werden sogar verschiedene
Schraffuren und die Farbe für Rectangle eingestellt.

Also müßte ja alles da sein.
Und mit StartPaint...EndPaint schaltest du auf die
entsprechende Bitmap um.
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
03.05.2019  
 




Rainer
Hoefs
Hallo H. Brill,

Genau diese Funktionen gehen nicht, da sie nur mit der Übergabe von RGB( ? , ? , ? )-Werten funktionieren.

Ich muß aber exakte Palettenindizies übergeben, also aus der Palette die Nr. 249 (oder andere zwischen 0 und 255).

Das ginge natürlich in einer binär geöffneten BMP mit binärem schreiben. Das ist aber extrem aufwändig.

trotzdem danke
Rainer
 
03.05.2019  
 




H.Brill
Ja, was ist denn die Palettennummer%, von der
du sprichst ?
Man kann ja auch mit den Funktionen

die einzelnen Farbanteile rausziehen, sodaß man
trotzdem mit RGB() arbeiten kann :

Ich meinte etwa so :
SetPixel x, y, RGB(GetRValue(Palettennummer%), GetGValue(Palettennummer%), GetBValue(Palettennummer%))
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
04.05.2019  
 




Rainer
Hoefs
Nein, so geht das nicht.

In einer 256-Farben Bitmap gibt es nach dem Header eine Palette mit 3*256 Farbwerten wie z.B 001 092 128 für die Farbe 1
254 003 178 für Farbe 2 oder
082 182 209 für 178 und auch
001 092 128 für die Farbe 200 also gleicher Farbton wie Farbe 1 usw.

In dem Bitmap-Bereich sind dann nur die Referenzen zu der Palette gesetzt also 1 2 178 2 200 2 1 178 2 1 usw.

Alle Infos, wo welcher Bereich, Header, Infoheader, Coreheader, Palette und Bitmap im File beginnen sind im Header gespeichert.

Beim Auslesen in einem entsprechenden Programm wie z.B. Grafx2 oder dem uralten DPaint2 wird nur gelesen welchen Paletteneintrag der Punkt hat, also 1 2 oder 178. Dabei ist es egal welcher Farbton in RGB dahintersteht. Der Punkt hat die Referenz als Palettennummer% zu den 3 RGB-Werten in der Palette

Ich muß nun die BMP so auslesen: wenn die Palettennummer% vom Pixel(X,Y) die Nummer 2 ist dann Setpixel(X1,Y, Palettennummer%), wenn es die Nummer 178 ist dann...

Bei Profan kann man das nicht tun, denn da werden die RGB-Werte als gesamte Zahl gelesen. Beim setpixel wird dann einfach ein Punkt gesetzt der zur nächst passenden Farbe stimmt, in diesem Fall also bei Farbe 200 im Punkt würde die 1 gesetzt, da sie ja beide den gleichen Wert haben. Liegen die Farben in der Palette eng zusammen, kommt ein wirres Bild dabei raus.

Ich kopiere hier mal den LUA-Code hinein zum besseren Verständnis:

--Adds a weft-stearing-system right side to the design
--created by Rainer Hoefs - www.rh-design.eu
--This script is free for your personal use.
--Es werden folgende Linien angesetzt
--direkt neben dem Design Fb 249 Linie 1
--dann Fb 4 Linie 2
--Streifen mit benutzten Schußfarben Fb 51 - 57 Linie 3
--dann Fb 1 Linie 4
--Streifen mit benutzten Schußfarben Fb 51 - 57 Linie 5
--dann FB 0 zur Trennung Linie 6
--dann 7 Linien mit den Fb 51 - 57 je nach auftreten im Design zur Kontrolle Linien 7 - 13

run("../samples_2.4/libs/memory.lua")
dofile("../samples_2.4/libs/dawnbringer_lib.lua")
dofile("../carpetdesign/include/_language.lua")

--****************************************************

if language == "DE" then
txt1="Schußsteuerungs-System rechts vom Design ansetzen"
txt2="max. Schußwechsler"
txt3="erste Farbe im Design"
txt4="max. Farben pro Shußlinie"
else
txt1="Add weftstsystem right from the design"
txt2="max. weftsystems"
txt3="first color in design"
txt4="max. colors per weftline"
end

--****************************************************

w, h = getpicturesize()

StartColor = 51
MaxColorPerWeft = 1
WeftSystems = 7

ok, WeftSystems, StartColor, MaxColorPerWeft = inputbox(
txt1,
txt2, WeftSystems, 1, 20, 7,
txt3, StartColor, 1, 255, 3,
txt4, MaxColorPerWeft, 1, 7, 2)

if ok then
-- neue Designgröße berechnen und Design entsprechend vergößern
newdesignw = w + 6 + WeftSystems
oldw = w
setpicturesize(newdesignw, h)
updatescreen()
-- Weiße Fläche mit festen Linien rechts vom Design zeichnen
drawfilledrect(oldw,0,newdesignw-1,h-1,249) -- rechts den Platz in Fb.249 anfügen
db.line(oldw + 1,0,oldw + 1,h-1,4) -- erste Linie mit Fb. 4
db.line(oldw + 3,0,oldw + 3,h-1,1) -- zweite Linie mit Fb. 1
db.line(oldw + 5,0,oldw + 5,h-1,0) -- zweite Linie mit Fb. 1
updatescreen()
-- Alle Zähler zurücksetzen
WeftColorFound = 0
SearchColor = StartColor
EndColor = StartColor + (WeftSystems - 1)
ControlLine = oldw + 6
-- Design Schuß für Schuß durchsuchen und Punkte in die Linien setzen!
for y = 0, h-1, 1 do -- die Schußlinien absuchen
for SearchColor = StartColor, EndColor , 1 do -- eine Farbe nach der anderen suchen
for x = 0, oldw - 1, 1 do -- die Fäden der Schußlinie nach und nach prüfen
c = getpicturepixel(x, y) -- Pixel einlesen
if c == SearchColor then -- wenn Farbe vom Pixel mit Suchfarbe übereinstimmt
WeftColorFound = WeftColorFound + 1 -- Zähler gefundene Farbe setzen
if WeftColorFound > MaxColorPerWeft then -- wenn mehr Farben im Schuß als erlaubt Fehlermeldung
messagebox("Mehr als "..MaxColorPerWeft.." Schußfarben gefunden!\n"..WeftColorFound.." gefunden, "..MaxColorPerWeft.." erlaubt!\nPosition: "..x.." / " ..y)
end
if WeftColorFound == 1 then
putpicturepixel(oldw + 2, y, c) -- Pixel in Steuerlinie 1 setzen
elseif WeftColorFound > 1 then
putpicturepixel(oldw + 4, y, c) -- Pixel in Steuerlinie 2 setzen
end
putpicturepixel(ControlLine, y, c) -- Kontrollpunkt setzen
updatescreen()
-- messagebox("Found SearchColor","X = "..x.."\nY = "..y.."\nSearchColor = "..SearchColor.."\nEndColor = "..EndColor.."\nControlLine = "..ControlLine.."\nWeftColorFound = "..WeftColorFound)
break
end
end
ControlLine = ControlLine + 1
end
WeftColorFound = 0
ControlLine = oldw + 6
end
updatescreen()
finalizepicture()
end;

Bitte nicht an den textilen Begriffen wie Design, Weftsystem oder Schußlinien stören. Weft und Schuß = Y-Linie
 
04.05.2019  
 




H.Brill
Da gibt es bestimmt auch für XProfan einiges.
z.B.
'########################################
'Farbpalette aus Bitmaps auslesen
'########################################
'########################################
'Andrea Miethe Mai 2002
'########################################
SetTrueColor 1
Declare Info#,RGBQuad_1Bit#,RGBQuad_4Bit#,RGBQuad_8Bit#
Declare Dateiname$,Colors&,x%,Col&,B%,H%
Dim Info#,200'nimmt die BitmapInfos auf
Dateiname$ = @LOADFILE$("Bitmap laden :","*.BMP")
Assign #1,Dateiname$
OpenRW #1
@BlockRead(#1,Info#,0,200)'BitmapInfos einlesen
Case Word(Info#,28) = 1  : Colors& = 2
Case Word(Info#,28) = 4  : Colors& = 16
Case Word(Info#,28) = 8  : Colors& = 256
window %maxx+1,0-640,480
cls RGB(192,192,192)
UsePen 0,0,RGB(255,255,255)

If Word(Info#,0) <> 19778

    Print "Kein Bitmap"

Endif

If Word(Info#,28) > 8

    Print "Kein Palettenbild"

Endif

If Colors& = 2

    Dim RGBQuad_1Bit#,8'  2 Farben-Palette
    Seek #1,54'hier beginnt die Palette
    @BlockRead(#1,RGBQuad_1Bit#,0,8)'BitmapInfos einlesen
    h% = 0

    Whilenot x% = 8

        Col& = RGB(byte(RGBQuad_1Bit#,x%+2),byte(RGBQuad_1Bit#,x%+1),byte(RGBQuad_1Bit#,x%))
        Usebrush 1,Col&
        Rectangle b%,h% - b%+20,h%+20
        add x%,4
        add B%,20

        if b% > 300

            add h%,20
            b% = 0

        endif

    EndWhile

Elseif Colors& = 16

    Dim RGBQuad_4Bit#,64' 16 Farben-Palette
    Seek #1,54'hier beginnt die Palette
    @BlockRead(#1,RGBQuad_4Bit#,0,64)'BitmapInfos einlesen
    h% = 0

    Whilenot x% = 64

        Col& = RGB(byte(RGBQuad_4Bit#,x%+2),byte(RGBQuad_4Bit#,x%+1),byte(RGBQuad_4Bit#,x%))
        Usebrush 1,Col&
        Rectangle b%,h% - b%+20,h%+20
        add x%,4
        add B%,20

        if b% > 300

            add h%,20
            b% = 0

        endif

    EndWhile

Elseif Colors& = 256

    Dim RGBQuad_8Bit#,1024'256 Farben-Palette
    Seek #1,54'hier beginnt die Palette
    @BlockRead(#1,RGBQuad_8Bit#,0,1024)'BitmapInfos einlesen
    h% = 0

    Whilenot x% = 1024

        Col& = RGB(byte(RGBQuad_8Bit#,x%+2),byte(RGBQuad_8Bit#,x%+1),byte(RGBQuad_8Bit#,x%))
        Usebrush 1,Col&
        Rectangle b%,h% - b%+20,h%+20
        add x%,4
        add B%,20

        if b% > 300

            add h%,20
            b% = 0

        endif

    EndWhile

Endif

CloseRW #1
setwindowpos %hwnd = 0,0-640,480
Waitinput
Dispose RGBQuad_1Bit#
Dispose RGBQuad_4Bit#
Dispose RGBQuad_8Bit#
Dispose Info#
end
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
04.05.2019  
 




Rainer
Hoefs
Hallo H. Brill,

vielen Dank für den Tip. Ja, das kenne ich, habe es 1998 auch schon in einem Programm so ähnlich ausgeführt.

Ich hoffte allerdings, es auf unkompliziertere Art und Weise lösen zu können, als über das binäre Lesen und Schreiben der Bitmap.

Aber da muß ich wohl mal meine Uralt-Routinen aktivieren und leider mit entsprechendem, Aufwand ändern.

Hat Andreas, der ja wirklich spitze war, auch eine Routine für das Auslesen der Bitmap (also Bildteil) geschrieben? Und wenn ja, wo kann man die auffinden?

Danke
Rainer
 
04.05.2019  
 




H.Brill
Den Code hatte ich von : [...] 

Was das Auslesen der Bitmap betrifft, wirst du wohl
selber ran müssen. Sowas ist ja auch sehr selten
gefragt. Hier habe ich noch eine Erläuterung von
Frank Abbing :

Mal sehen, ob ich es noch hinbekommen. Also, das Bmp-Format mit den Offsets:

0 immer "BM" (2)
2 Länge der Datei (4)
6 =0 (4)
10 Offset des ersten Grafikbytes (4)
14 =40 (4)
18 Breite des Bilds (4)
22 Höhe des Bilds (4)
26 ...unwichtig...

Zuerst LongInt Offset 10 auslesen. Hier fangen die Grafikdaten an.
Pro Pixel werden 3 Bytes benötigt immer in der Reihenfolge Blau - Grün - Rot.
Nach jeder Zeile wird die Pixelfolge mit Nullbytes auf eine durch 4 teilbare Anzahl ergänzt.
Die Pixel des Bilds sind von links unten nach rechts oben angeordnet.


Ich denke, daß man das Auslesen des Bildteils recht einfach hinbekommt.

Kommt dann natürlich darauf an, was man alles so an Funktionen braucht.

PS: Die ProSpeed.dll bietet eine Funktion, die die Nutzdaten einer
Bilddatei in ein Byte-Array speichert. Kannst du dir evtl. auch mal
ansehen.
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
04.05.2019  
 




H.Brill
Hier habe ich noch etwas mehr Infos gefunden : [...] 

Die Profbmp.dll
Vor allem in der beigefügten Textdatei profbmp.txt
stehen interessante Infos.
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
04.05.2019  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

6.708 Betrachtungen

Unbenanntvor 0 min.
Rainer Hoefs05.09.2023
H.Brill30.12.2021
Sven Bader23.10.2021
N.Art18.11.2020
Mehr...

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

H.Brill (5x)
Rainer Hoefs (4x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie