|
actually hoinestly i dunno ....
What i am told to do is ...
Group information similar to pixels ...and send them in this format as text ...as in SMS ....
So , most probably it would be color ....
Please help
Thanks ,
Jomy
|
|
|
|
|
You can get the colour values of a bitmap by using a DIBSection to hold it, or by using GDI+ ( which comes with VC7, is in the PSDK for VC6 ). Or you can use the GetPixel function on the DC, but that's really slow. Also, if you don't use a DIBSection or just a DIB, you won't get an accurate color value range for your image, unless your computer is running in 24 bit mode.
So you want to turn an image into text, so it can be sent as ASCII art ? There's at least one article on doing this on this site, do a search for it and your problems may be solved.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
Im not supposed to use VC ....plain C++ ...
Im thought of using the getpixel() function but ...its returning me ..integer values ...actually am not sure ..whether im thinking in the right pattern or not ...
And would ASCII art fit into the SMS character set ?? Only then i would be able to use it ...
Please guide ....
Thanks
Jomy
|
|
|
|
|
Jomy John wrote:
Im not supposed to use VC ....plain C++ ...
Well, if you're using bitmaps in Windows, then you need to use Windows bitmap structures.
Jomy John wrote:
Im thought of using the getpixel() function but ...its returning me ..integer values
Use GetRValue, GetGValue and GetBValue macros to get the colours out of that COLORREF.
Jomy John wrote:
And would ASCII art fit into the SMS character set ?? Only then i would be able to use it ...
ASCII art uses any characters you like, AFAIK.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
Honestly ...i did not understand anything of what uve said ...
Can you please explain in detail ...if its not a botheration ..
as in GetRValue , GetBValue ..etc are functions in C++ or VC++ ??
Help !! Sorry for the trouble .....
Thanks, Jomy
|
|
|
|
|
Jomy John wrote:
as in GetRValue , GetBValue ..etc are functions in C++ or VC++ ??
The obvious thing would have been to type them into the IDE and see what happened. A COLORREF is just a DWORD, and the GetXValue macros just use byte shifting to pull out the single color. If you wanted to deal with colors as a unit, rather than the pixel values, you may as well sort/group on the colorref, but if you want to work out what the colors are, you need to pull them out in this way.
In all cases, they are specific to Windows, and probably to VC.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
Anyways its not suiting my purpose...i just cant use VC!!
My project guide in college wants me to compulsorily use ..plain ol C++ !!!
Also , in a Jpeg file ...where do i get the pixel related color information ...as in I scanned the Jpeg file format ...but I cant find a specific offset from where actual pixel information starts ....
jpeg is just clustered as headers .....
Please tell me
Thanks , Jomy
|
|
|
|
|
Jomy John wrote:
My project guide in college wants me to compulsorily use ..plain ol C++ !!!
Bloody hell. Your guide is an idiot. 'plain old C++' knows nothing about images, let alone colours.
Jomy John wrote:
Also , in a Jpeg file ...where do i get the pixel related color information ...as in I scanned the Jpeg file format ...but I cant find a specific offset from where actual pixel information starts ....
Nope, it doesn't work that way. A jpeg is compressed, which means you need to use a library, which means you won't be using 'plain old c++'
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
How i wish i could tell him that !!
But i have to ....sadly ...for making life hell for me
Is there like no solution for this problem ?? Although im not sure ..but mebbe hez asking me to do it using C++ , bcos eventually when i want to send my file as an SMS , i have Symbian as my OS ...and mebbe it supports only that compiler ...!!!
Anyways , as Jpeg is compressed , like you said ....
How would i then read the RGB / YCbCr values ??
Please help me wid this !!!
A totally frustrated jomy
|
|
|
|
|
Jomy John wrote:
Is there like no solution for this problem ??
The solution is that your code needs to take an array of color values, and not a bitmap of any sort. Because all bitmap formats fall outside the bounds of 'standard C++'.
Jomy John wrote:
Anyways , as Jpeg is compressed , like you said ....
How would i then read the RGB / YCbCr values ??
Ya just can't. If you're not allowed to use GDI+, I don't see how you could be allowed to use any other library for reading jpegs. I'm sure your teacher knows this, and that you're completely misunderstanding the task at hand. Paintlib is one cross platform library that will let you read jpegs and get the pixel values.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
Ok...heights now my giude tells me that my way was totally wrong ...
He wants me to learn algorithms ...that will are general to all iamges ... !!
ie how an image will be stored on the hdd..it seems there is an algo for that ..that applies to all types of images
Does neone have a knowledge abt this ?? Sorry ...abt the confusion created in the above posts ..
Thanks ,
Jomy
|
|
|
|
|
Jomy John wrote:
ie how an image will be stored on the hdd..it seems there is an algo for that ..that applies to all types of images
Sorry, but you MUST still be confused. How an image is stored depends on the format, and is common to all image types only in that, at the end of the day, it's all a bunch of 1s and 0s. There's a variety of compression algorithms used in image formats, but no common one. BMP is one that is not compressed at all.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
No..im just quoting the stuff my project guide has said ...
Like he gave me an example was : When u open a paint application ...draw sumthing in it ..and the "Save As" option gives options to save as a number of file options ..
So , there has to be a general algo that applies to all ..
Sadly, he had read it in a book ,6-7 yrs back...hehee..whose name he cant recall
|
|
|
|
|
Jomy John wrote:
When u open a paint application ...draw sumthing in it ..and the "Save As" option gives options to save as a number of file options ..
Yes, there are options. And for each one, the image is encoded differently, that's what makes them options
Jomy John wrote:
So , there has to be a general algo that applies to all ..
Bollocks. The only thing that is general is that you need to use a disk API to write the files, and you need in every case to access the bits of the image, which would generally mean you used a DIBSection, which in turn means you have a pointer to the bitmap. The only algorithm I can thing of is how you traverse those bits.
Jomy John wrote:
Sadly, he had read it in a book ,6-7 yrs back...hehee..whose name he cant recall
How in the HELL can he test you on something he 'read in a book 7 years ago' ? If he does not know the answer, if he does not have, or cannot produce a solution, how will he mark yours ?
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
I really dont know what to do or say
|
|
|
|
|
Assuming that the JPEG is decoded and that you have a raw RGB888 (24 bpp) DWORD-aligned stream:
- Get a pointer to the first
DWORD , pPixel . - Assign the color componenent values of that pixel to a
COLORREEF , color = *pPixel . - Multiply the RGB components to get the intensity (assuming that is the intensity definition...),
intensity = GetRValue(color) * GetGValue(color) * GetBValue(color) . - Store the pixel id and its intensity somehow (defined by you),
StorePixelIntensity(id, intensity) . - Continue to the next pixel,
++pPixel . - Goto 1 if there are more pixels.
--
The Blog: Bits and Pieces
-- modified at 2:05 Wednesday 21st September, 2005
|
|
|
|
|
i have to code purely in C++ ...!!!
newes ..using Sir Johann 's method is gud..assuming thats the right defn of intensity ....
Anuther thing one of my friends suggested ..was to convert to gray scale ..and check for similar intensity ...
Will that be rite ?
And all i have with me in C++ , for RGB color extraction is getpixel() ...how do i process my Jpeg file using getpixel as its just returning me single integer values ....
That is ...
int c = getpixel(0,0)
cout << c ;
gives me not the typical 32 bit value ...but a single 0
and a series of sets of 0's and 7's when tried for the entire file !
How should i continue ?
Thanks
Jomy
|
|
|
|
|
My question is about pointers to pointers. A book I’m using to teach myself C++ uses a function whose first argument is a pointer to a pointer and receives the address of the root pointer into that binary tree class insertion function. It says that it uses the pointer to a pointer in order to modify the pointer's value. In general, why would one ever have to use a pointer to a pointer, instead of just passing the pointer itself? It just seems like a needless extra step to me.
The code is posted below:
template< class NODETYPE>
void Tree<nodetype>::insertNode(const NODETYPE &value)
{
insertNodeHelper( &rootPtr, value);
}
template< class NODETYPE>
void Tree<nodetype>::insertNodeHelper( TreeNode< NODETYPE> **ptr, const NODETYPE &value)
{
if(*ptr == 0)
*ptr = new TreeNode< NODETYPE> (value);
else
if (value < (*ptr)->data)
insertNodeHelper(&((*ptr)->leftPtr), value);
else
if (value >(*ptr)->data)
insertNodeHelper(&((*ptr)->rightPtr), value);
else cout << value << " dup" << endl;
}
Any help or insight would be greatly appreciated.
|
|
|
|
|
passing pointer to any function passes copy of that pointer. It will give problem when you change the variable it is addressing.
Good article is present on CP,which has explained with example the problem.
http://www.codeproject.com/cpp/PtrToPtr.asp#1[^]
|
|
|
|
|
There are also a lot of techniques in which you may pass processing to one of a set of functions by means of a switch statement. If you have an array of function pointers you could simply pass to that offset in your array of pointers.
There's also ease of adding a new function to that list where all you need to do is add an extra switch statement and the pointer into the array.
|
|
|
|
|
Normaly you try to write your code so that passing a pointer to a pointer is not needed, but some times it is needed.
int alloc_type(NODE** ptr)
{ return( (*ptr=(NODE*)malloc(sizeof(NODE)) != (NODE*)0) ); }
somefunc()
{
NODE* ptr = (NODE*)0;
if( alloc_type(&ptr) )
}
What the provided code is doing:
1) The first time insertNodeHelper is called, rootPtr is null, so it just allocates a new node. That is, rootPtr now points to a node.
2) The second time insertNodeHelper is called it recursively calls itself to allocate/add a new leaf node. The recursive call has no effect on the rootPtr.
3) See (2).
The code you provided is a good example of when you might use a pointer to a pointer as an argument. It is very creative and provides a simple solution for what could be a difficult problem.
I do not know if a latter example shows you how to remove the recursive call, but there should be one. If not, consider it your next assignment.
INTP
Every thing is relative...
|
|
|
|
|
Can someone please tell me how the following is possible?
How is it possible to cast a LeafTrieNode pointer to a "NonLeafTrieNode" pointer, like this?
<br />
p->ptrs[pos] = (NonLeafTrieNode*) new LeafTrieNode(suffix);<br />
The program works like this, but I don't know how it works, because "LeafTrieNode" isn't derived from "NonLeafTrieNode"
<br />
"lieaftrienode.h"<br />
<br />
#ifndef LEAF_TRIE_NODE_H<br />
#define LEAF_TRIE_NODE_H<br />
<br />
class LeafTrieNode<br />
{<br />
public:<br />
LeafTrieNode(){};<br />
LeafTrieNode(char*);<br />
<br />
private:<br />
bool leaf;<br />
char *word;<br />
friend class Trie;<br />
};<br />
<br />
#endif<br />
<br />
"nonlieaftrienode.h"<br />
<br />
#ifndef NON_LEAF_TRIE_NODE_H<br />
<br />
#define NON_LEAF_TRIE_NODE_H<br />
<br />
class NonLeafTrieNode<br />
{<br />
public:<br />
NonLeafTrieNode(){};<br />
NonLeafTrieNode(char);<br />
<br />
private:<br />
friend class Trie;<br />
<br />
NonLeafTrieNode **ptrs;<br />
char *letters;<br />
bool isLeaf;<br />
bool endOfWord;<br />
};<br />
<br />
#endif<br />
-- modified at 9:54 Monday 19th September, 2005
|
|
|
|
|
Hi,
Simple answer is the same way you can cast anything else with a pointer. A pointer just points to memory, hence it can be made to "think" that it is pointing to a different object type.
The new creates a pointer of type LeafTrieNode , and the cast works because you are allowed to change a pointers type.
regards,
Rich
"Programming today is a race between software engineers striving to build bigger and
better idiot-proff programs, and the Universe trying to produce bigger and better idiots.
So far the Universe is winning." -- Rich Cook
|
|
|
|
|
Hi Rich,
I'm just pondering how his compiler is allowing the cross reference from one object pointer to the other unless p-> is of void that, yes just points to raw memory space by which he will need to not only delete the pointer but reclaim the memory space as well or get a memory leak.
|
|
|
|
|
Hi VaporTrace,
It is just a cast. Any pointer can be cast into any other pointer. The fact that they are unrelated is the programmers fault. Yes you would get a memory leak if you deleted the pointer as is, but the programmer caused the problem not the compiler. Take the situation:
class A {};
class B {};
A *castme = (A *) new B();
The compiler just makes castme point to the memory irrespective of the pointers original type. Remember C/C++ is not type safe so you are allowed to do things like this. Ask yourself how void pointers are created. They need to be a pointer of some type before they become a void pointer; you would have had to cast it to a void pointer first.
Hope this explains it better.
regards,
Rich
"Programming today is a race between software engineers striving to build bigger and
better idiot-proff programs, and the Universe trying to produce bigger and better idiots.
So far the Universe is winning." -- Rich Cook
|
|
|
|