Dear SFML-Community,
i started a topic ealier, where i searched for help with a strange problem. The "Solution" of my last topic was, that i updated to sfml 2.0.
So here's my problem now in sfml 2.0:
I have a class called "Position" with an sfml-Image as member. Declared as following:
class Position
{
private:
sf::Image CaptchaImage;
[...]
}
The constructor of the Class:
Position::Position(const char* Filename)
{
CaptchaImage.create(IMAGE_WIDTH, IMAGE_HEIGHT, sf::Color(0, 0, 0)); //Create an empty Image
if(!CaptchaImage.loadFromFile(Filename)); //Load the file into our Image
{
std::cout << "I couldnt read the image from " << Filename << std::endl;
exit(12);
}
}
So in my main.cpp I create an Instance of class Position:
Position Position("cb.bmp");
And guess what? I get the same output as in sfml 1.6:
"I couldnt read the image from cb.bmp".
This is the output I do, NOT the output that the loadFromFile() does.
So loadFromFile() fails loading the image and is not giving any Reason.
The Image IS compatible with SFML because if I do the following in the main.cpp:
sf::Image image;
if(!image.loadFromFile("cb.bmp"))
std::cout << "Failed";
else
std::cout << "Success";
It works fine!! Is this just me or is this kind of strange? I can post more code if needed.
Many thanks in advance,
Luapina
Edit:
Even IN THE SAME project but in the main.cpp the following code works:
sf::Image image;
if(!image.loadFromFile("cb.bmp"))
std::cout << "Failed";
else
std::cout << "Success";
Maybe its a problem because of my bad english but:
The biggest part of my Problem is, that sfml does NOT give any output.
I call the loadFromFile function:
if(!CaptchaImage.loadFromFile(Filename)); //Load the file into our Image
{
std::cout << "I couldnt read the image from " << Filename << std::endl;
exit(12);
}
And it only says "I couldnt read the image from cb.bmp". That is my output and the function itself doesnt give any output. This is what makes it so hard for me to solve this Problem.
My three files:
main.cpp
#include "Word_Position.hpp"
Position Position("cb.bmp"); //Calling the constructor here
int main()
{
Position.SetWordRect();
std::cout << "Left: " << Position.tX
<< "\nTop: " << Position.tY
<< "\nWidth: " << Position.tWidth
<< "\nHeight: " << Position.tHeight
<< std::endl;
}
Word_Position.cpp:
/*
Word_Position.cpp
Paul Brandt
24.05.2013
This code preforms a simple Pixel-by-Pixel check, to get the position and size of the word in the captcha.
*/
#include "Word_Position.hpp"
bool Position::PixelIsNonWhite(int pX, int pY) //Preform a simple test if one single pixel is set to a non-white color
{
if(CaptchaImage.getPixel(pX, pY) != sf::Color(255, 255, 255)) //Check if the Pixel has an other color than white
return true; //Pixel is not white (HIT)
else
return false; //Pixel is white (NO HIT)
}
void Position::SetWordRect() //Store the Position, Size(Pixel) of a word we found. Also provides some usefull memberfunctions.
{
//Our first step is to find out the X-Coordinate
for(int x = 0; x<IMAGE_WIDTH; x++) //Use the X-Coordinate as Outer-LOOP
{
for(int y = 0; y<IMAGE_HEIGHT; y++) //Use the Y-Coordinate as Inner-LOOP
{
if(PixelIsNonWhite(x, y)) tX = x;
}
}
//Next step is to find out the Y-Coordinate
for(int y = 0; y<IMAGE_HEIGHT; y++) //Use the Y-Coordinate as Outer-LOOP
{
for(int x = 0; x<IMAGE_WIDTH; x++) //Use the Y-Coordinate as Inner-LOOP
{
if(PixelIsNonWhite(x, y)) tY = y;
}
}
// We did some great work on finding the upper left corner
// Now we will find the downer right corner.
// Same procedure just the other was round:
//Our first step is to find out the X-Coordinate
for(int x = IMAGE_WIDTH; x>0; x--) //Use the X-Coordinate as Outer-LOOP
{
for(int y = IMAGE_HEIGHT; y>0; y--) //Use the Y-Coordinate as Inner-LOOP
{
if(PixelIsNonWhite(x, y)) tWidth = x - tX;
}
}
//Next step is to find out the Y-Coordinate
for(int y = IMAGE_HEIGHT; y>0; y--) //Use the Y-Coordinate as Outer-LOOP
{
for(int x = IMAGE_WIDTH; x>0; x--) //Use the Y-Coordinate as Inner-LOOP
{
if(PixelIsNonWhite(x, y)) tHeight = y - tY;
}
}
}
Position::Position(const char* Filename)
{
CaptchaImage.create(IMAGE_WIDTH, IMAGE_HEIGHT, sf::Color(0, 0, 0)); //Create an empty Image
if(!CaptchaImage.loadFromFile(Filename)); //Load the file into our Image
{
std::cout << "I couldnt read the image from " << Filename << std::endl;
exit(12);
}
}
Word_Position.hpp:
#include <SFML/Graphics.hpp> //We use the SFML library to preform our image-checks
#include <iostream>
#define IMAGE_WIDTH 300 //300 by 57 is the Defaut Image Size in ReCaptcha.
#define IMAGE_HEIGHT 57 //Change it with you needs.
#define POS_ENABLED true //Define if we want to scan for pixel with tolerance in Position - Doesnt make that much sense without
#define ROT_ENABLED false //Define if we want to scan for pixel with tolerance in Rotation - Mostly we dont need this
#define POS_TOLERANCE 0.05f
#define ROT_TOLERANCE 0.10f
#define COLOR_TOLERANCE 0.30f
class Position
{
private:
sf::Image CaptchaImage;
bool PixelIsNonWhite(int pX, int pY);
public:
void SetWordRect();
Position(const char* Filename);
int tX; //We store the Coordinates public since this is the fastest way to access them.
int tY;
int tWidth; //Same here
int tHeight;
};
EDIT:
Made a video which descibes the problem better than I do:
http://www.youtube.com/watch?v=qdLnPxmROuk
Found your problem.
if(!CaptchaImage.loadFromFile(Filename)); //Load the file into our Image
{
std::cout << "I couldnt read the image from " << Filename << std::endl;
exit(12);
}
Look VERY carefully at these lines. Notice anything? You have an extra semicolon in there. Try removing it.