Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Phili

unregistriert

71

17.07.2006, 20:08

@nix da
Bitte, bitte, bitte... :cry:

Anonymous

unregistriert

72

17.07.2006, 20:09

Ist ja gut ;)

Phili

unregistriert

73

17.07.2006, 20:10

@nix da
Also... Gibts keine Möglichkeit, die größe eines Files bei fstream ´zu ermitteln?

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

74

17.07.2006, 21:09

Ich benutze fstream nicht, daher kann ich auch nicht sagen, ob es eine Methode gibt, mit der man die Dateigröße ermitteln kann. Was ich aber wohl sagen kann, ist dass eine "Vorhersage" der Länge des Datenstroms nicht dem Streaming-Prinzip entspricht.
Da du ja selbst gesagt hast, dass du eines Tages von fstream wegwillst, frage ich dich, warum nicht jetzt?
Kommen Sie nie mit einem Schwert zu einer Schießerei.

Phili

unregistriert

75

17.07.2006, 21:21

Kompiliert mal diesen Quellcode und startets mal(einfach den namen von ner Bitmap im ordner angeben). Mir ist rätselhaft, was es macht(jedennfalls nciht was es sollte) aber es sieht genial aus!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;

struct PH3DBitmapHeader
{
    char a[14];
};
struct PH3DBitmapInfo
{
    DWORD biSize;
    LONG biWidth;
    LONG biHeight;
    WORD biPlanes;
    WORD biBitCount;
    DWORD biCompression;
    DWORD biSizeImage;
    LONG biXPelsPerMeter;  
    LONG biYPelsPerMeter; 
    DWORD biClrUsed;
    DWORD biClrImportant;
};

int main()
{
    char a[100];
    cin>>a;
    ifstream ifs(a, ios::binary);
    ofstream ofs("Resultat.bmp", ios::binary);
    PH3DBitmapHeader Header;
    PH3DBitmapInfo Info;

    ifs.read((char*)&Header, 14);
    ifs.read((char*)&Info, 40);
    char *Buffer=new char[Info.biSizeImage];
    ifs.read((char*)Buffer, Info.biSizeImage);
    cout<<Info.biCompression;
    ifs.close();
    for(int i=0; i<Info.biHeight*Info.biWidth*3-1; i++)
    {
        Buffer[i]=(Buffer[i]+Buffer[i+1])/2;
        
    }
    ofs.write((char*)&Header, 14);
    ofs.write((char*)&Info, 40);
    ofs.write((char*)Buffer, Info.biSizeImage);
    ofs.close();

    system ("PAUSE");
    return 0;
}

Anonymous

unregistriert

76

17.07.2006, 21:24

Phili
Gefährlich! Du Speichers die Farbkanäle in einen char ab! Es muß aber unsigned char heißen!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

77

18.07.2006, 01:11

Was der Code macht ist ja auch mal ... nicht so schön ;)

Buffer=(Buffer[i]+Buffer[i+1])/2;

Er weißt also einer Var in dem Array den Mittelwert des Varwertes + den nachfolgenden Wert zu. Das Ergebnis kann in meinen Augen nur eine ziemlich hässliche Verwaschung sein. Willst du die Nachbarpixel miteinander interpolieren oder was? Wenn ja solltest du lieber mit einer selbst definierten struct arbeiten. z.B. sowas:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct Pixel
{
   unsigned char r,g,b;

   inline Pixel operator + (const Pixel& m) const
   {
       Pixel tempP;
       tempP.r = this->r + m.r;
       tempP.g = this->g + m.g;
       tempP.b = this->b + m.b;
       return tempP;
   }    

   inline Pixel operator / (const float f) const
   {
       if(!f) return *this;

       Pixel tempP;
       tempP.r = this->r / f;
       tempP.g = this->g / f;
       tempP.b = this->b / f;

       return tempP;
   }    
};
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Phili

unregistriert

78

18.07.2006, 13:27

@nix da
Ah, hast mal wieder nen Fehler bei mir aufgedeckt. Aber es ist echt nen Blick Wert, was passiert wenn mans in nen char macht! Absolut faszinieren!
Trotzdem danke, werds mal mit unsigned versuchen.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

79

18.07.2006, 13:32

char hat die Größe eines Bytes, also (2^(8*1))-1 mgl. Zeichen, d.h. 0... 255. Ein signed char hat aber nur den Bereich -128... 127 (weil 0 pos. ist). somit hast du wenn du nur char schreibst, also implizit signed char ein problem.

Beachte aber auch mal was nox geschrieben hat

p.s. die 8*1 steht nur wegen dem Smiley da

Phili

unregistriert

80

18.07.2006, 13:50

@Nox
Naa, die Verwaschung wars schon, was ich wollte. War nur son bisschen zu rumprobieren und experimentieren... :lol:

Werbeanzeige