Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Farbe suchen und addieren

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Andy19312



Anmeldungsdatum: 22.10.2005
Beiträge: 428

BeitragVerfasst am: 16.03.2010, 00:40    Titel: Farbe suchen und addieren Antworten mit Zitat

Hallo zusammen,
ich hab jetzt eine Datei, deren Inhalt Zeile für Zeile für 1 Pixel steht.

z.B. so

Zeile 1 = ff0000
Zeile 2 = ff0000
Zeile 3 = ff0000
Zeile 4 = ff0000
Zeile 5 = 00ff00
Zeile 6 = 00ff00
Zeile 7 = ff0000
Zeile 8 = ff0000
Zeile 9 = 00ff00

Selbstverständlich ist das jetzt nur mal so hergenommen.
In der Datei sind natürlich viel mehr Farben drin vertreten.

Nun möchte ich wissen, wie oft die Farbe ff0000 und die Farbe 00ff00 vorkam.

Ich hatte folgendes gedacht "will aber nicht" :

Code:

screenres 300,300,32

redim array    (1 to 10000000) as string
redim addierung(1 to 10000000) as integer
redim pixel    (1 to 10000000) as string
dim a as integer
dim aaa as integer
dim i as integer
dim ii as integer
dim aa as integer

kill "C:\Bild1+.bin"
open "C:\Bild1.bin" for input as #1
do
a = a + 1   
input #1, array(a)
loop until eof(1)
close #1

open "C:\Bild1+.bin" for input as #1
'eine Schleife von 1 bis Zeilende
'Zeilende ist - 2, da in den letzten 2 Zeilen noch was anderes steht
for i = 1 to a-2
   
    'hier wird herausgefunden, wie weit das Pixel array schon geschrieben wurde
    input #1, aa
   
   
    'eine Schleife von 0 nach Anzahl Pixelarray
    for ii = 0 to aa+1
    'wenn das nächste Pixel schon im Pixelarray liegt, addieren
    if array(i) = pixel(ii) then
        addierung(ii) = addierung(ii) + 1
    'ansonsten den Pixelwert in das Pixelarray schreiben
    else
        aaa = aa + 1
        open "C:\Bild1+.bin" for output as #2 
        print #2, aaa
        close #2   
        pixel(aaa) = array(i)
    end if
    next

next
close #1
'und hier das gelump anzeigen
for i = 1 to 10
    print pixel(i)
next
sleep


weinen


Zuletzt bearbeitet von Andy19312 am 16.03.2010, 01:09, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 16.03.2010, 01:03    Titel: Antworten mit Zitat

Das Programm tut in der Tat etwas ganz anderes, als du haben willst. Warum schreibst du nicht ein anderes Programm, was genau das tut, was du willst?
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Andy19312



Anmeldungsdatum: 22.10.2005
Beiträge: 428

BeitragVerfasst am: 16.03.2010, 01:05    Titel: Antworten mit Zitat

@Jojo weil ich immer wieder den gleichen Denkfehler habe und es nicht hinbekomme
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 16.03.2010, 16:26    Titel: Antworten mit Zitat

Code:
KILL "C:\Bild1+.BIN"
OPEN "C:\Bild1.BIN" FOR INPUT AS #1
DO
a = a + 1   
INPUT #1, array(a)
LOOP UNTIL EOF(1)
CLOSE #1

OPEN "C:\Bild1+.BIN" FOR INPUT AS #1

Ich nehme mal an, Bild1+.BIN hat zu diesem Zeitpunkt 0 Zeilen, weil die Datei vorhin gelöscht wurde?
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Andy19312



Anmeldungsdatum: 22.10.2005
Beiträge: 428

BeitragVerfasst am: 16.03.2010, 20:07    Titel: Antworten mit Zitat

jepp
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 16.03.2010, 21:56    Titel: Antworten mit Zitat

dir ist schon klar, dass es dann auch nix zum Auslesen mit INPUT gibt? So viel Logikverstand musst du doch noch haben...
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Andy19312



Anmeldungsdatum: 22.10.2005
Beiträge: 428

BeitragVerfasst am: 16.03.2010, 22:05    Titel: Antworten mit Zitat

Im nächsten Schleifendurchlauf, müsste er normalerweise mit input was haben

Code:

FOR ii = 0 TO aa+1


Wenn er in das Array was geschrieben hat
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 16.03.2010, 22:07    Titel: Antworten mit Zitat

von nichts kommt nichts - du kannst aus einer leeren datei keine daten lesen!
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Andy19312



Anmeldungsdatum: 22.10.2005
Beiträge: 428

BeitragVerfasst am: 17.03.2010, 13:44    Titel: Antworten mit Zitat

12:00
Guden,
werde nachher den Code online stellen "ich meine, dass ich mich zurzeit auf dem richtigen Pfad befinde".

13:00
Es war zwar der richtige Pfad gewesen, aber keine Ahnung, ob es eine schnellere Möglichkeit gibt:

Code:

screenres 400,400,32
redim array     (1 to 10000000) as string
redim what      (1 to 10000000) as string
redim pixel     (1 to 10000000) as integer
redim gefundene (1 to 10000000) as string

dim a as ulongint
dim b as ulongint
dim c as ulongint

dim i as ulongint
dim ii as ulongint

dim addieren as ulongint
dim prellung as single


OPEN "C:\Bild1.BIN" FOR INPUT AS #1
DO
a = a + 1   
INPUT #1, array(a)
LOOP UNTIL EOF(1)
CLOSE #1

for i = 1 to a-2
   
    for ii = i to a-2
        if array(i) = array(ii) then
            addieren = addieren +1
           
                if prellung = 0 then
                    b = b + 1
                    what(b) = array(i)
                    prellung = 1
                end if
        end if
    next
pixel(i) = addieren
addieren = 0   
prellung = 0

next

for i = 1 to b
    for ii = 1+i to b
        if what(i) = what(ii) then
            what(ii) = ""
        end if
    next
next

for i = 1 to b
    if len(what(i)) > 0 then
        c = c + 1
        gefundene(c) = what(i)+" "+str(pixel(i))
    end if
next
OPEN "C:\gefundene.BIN" FOR OUTPUT AS #2
for i = 1 to c
PRINT #2, gefundene(i)
next       
CLOSE #2
print "Es wurden ";c;" unterschiedliche Farben gefunden :D"
sleep



Mal gucken, der Code ist ziemlich rechenaufwendig für ein Bild, bei dem mehrere Farben drinne vorkommen
Cu Andy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 17.03.2010, 19:32    Titel: Antworten mit Zitat

Ich habe mich jetzt nicht wirklich in den Code hineindenken können, auf jeden Fall wächst der Aufwand quadratisch zur Anzahl der Dateizeilen. Linear wäre wesentlich besser; dazu hätte ich von Anfang an anders gezählt.

Code:
OPEN "C:\Bild1.BIN" FOR INPUT AS #1
for i = 1 to a-2
  INPUT #1, farbe
  if farbenhaeufigkeit(val("&h" & farbe)) = 0 then farbenzahl += 1
  farbenhaeufigkeit(val("&h" & farbe)) += 1
next
CLOSE #1

farbenhaeufigkeit zählt, wie oft welche Farbe vorkommt. farbenzahl wäre dann die Anzahl unterschiedlicher Farben.

Nachteil ist, dass du ein Array mit 2^24 Elementen brauchst.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 17.03.2010, 19:39    Titel: Antworten mit Zitat

Das ist glaube ich heutzutage weniger ein Problem. 64 MB sind nicht so unglaublich viel... Und die werden ja eh nur dann angefordert, wenn das Array nach und nach gefüllt wird.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz