Get pixel data from image UWP
up vote
0
down vote
favorite
I'm writing a simple tool, the user can select an image and it should list all the colors found in the picture.
Now, I'm facing 2 main issues, one is that it's slow because I'm looping through all the pixels in an image.
Second, I'm getting unexpected results.
First thing's first, the code:
public static async Task<List<ImageColor>> GetImageColorsAsync(StorageFile image)
{
List<ImageColor> colors = new List<ImageColor>();
var imagestream = await image.OpenStreamForReadAsync(); // Convert image to stream
var imageDecoder = await BitmapDecoder.CreateAsync(imagestream.AsRandomAccessStream()); // decode stream
var imagePixelData = await imageDecoder.GetPixelDataAsync(); // get information about pixels
var bytes = imagePixelData.DetachPixelData(); // get pixel data
for (int x = 0; x < imageDecoder.PixelWidth; x++)
{
for (int y = 0; y < imageDecoder.PixelHeight; y++)
{
var location = (y * (int)imageDecoder.PixelWidth + x) * 3; // Navigate to corresponding coordinates
var color = Color.FromArgb(0, bytes[location + 0], bytes[location + 1], bytes[location + 2]); // Filter Red Green Blue and convert this to Argb
// find if color already exsists from its hex code
string hex = color.ToString();
var prevColor = colors.FirstOrDefault(a => a.ColorCodeHex == hex);
if (colors.Count == 0 || prevColor == null)
{
// new color
ImageColor imgColor = new ImageColor()
{
R = color.R,
G = color.G,
B = color.B,
ColorCodeHex = hex,
Occurence = 1
};
colors.Add(imgColor);
}
else
{
// exsisting color
prevColor.Occurence++;
}
}
}
return colors;
}
Now, do I really need to go through every single pixel?
And, what I did was test this function using a black image (completely black) and what I got was that there are 4 colors in that picture: black, red, green and blue.
Now the lines where I find the location and color are not mine, I found them online and I can't really verify that this is how you should do it.
Any help guys?
c# uwp
add a comment |
up vote
0
down vote
favorite
I'm writing a simple tool, the user can select an image and it should list all the colors found in the picture.
Now, I'm facing 2 main issues, one is that it's slow because I'm looping through all the pixels in an image.
Second, I'm getting unexpected results.
First thing's first, the code:
public static async Task<List<ImageColor>> GetImageColorsAsync(StorageFile image)
{
List<ImageColor> colors = new List<ImageColor>();
var imagestream = await image.OpenStreamForReadAsync(); // Convert image to stream
var imageDecoder = await BitmapDecoder.CreateAsync(imagestream.AsRandomAccessStream()); // decode stream
var imagePixelData = await imageDecoder.GetPixelDataAsync(); // get information about pixels
var bytes = imagePixelData.DetachPixelData(); // get pixel data
for (int x = 0; x < imageDecoder.PixelWidth; x++)
{
for (int y = 0; y < imageDecoder.PixelHeight; y++)
{
var location = (y * (int)imageDecoder.PixelWidth + x) * 3; // Navigate to corresponding coordinates
var color = Color.FromArgb(0, bytes[location + 0], bytes[location + 1], bytes[location + 2]); // Filter Red Green Blue and convert this to Argb
// find if color already exsists from its hex code
string hex = color.ToString();
var prevColor = colors.FirstOrDefault(a => a.ColorCodeHex == hex);
if (colors.Count == 0 || prevColor == null)
{
// new color
ImageColor imgColor = new ImageColor()
{
R = color.R,
G = color.G,
B = color.B,
ColorCodeHex = hex,
Occurence = 1
};
colors.Add(imgColor);
}
else
{
// exsisting color
prevColor.Occurence++;
}
}
}
return colors;
}
Now, do I really need to go through every single pixel?
And, what I did was test this function using a black image (completely black) and what I got was that there are 4 colors in that picture: black, red, green and blue.
Now the lines where I find the location and color are not mine, I found them online and I can't really verify that this is how you should do it.
Any help guys?
c# uwp
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I'm writing a simple tool, the user can select an image and it should list all the colors found in the picture.
Now, I'm facing 2 main issues, one is that it's slow because I'm looping through all the pixels in an image.
Second, I'm getting unexpected results.
First thing's first, the code:
public static async Task<List<ImageColor>> GetImageColorsAsync(StorageFile image)
{
List<ImageColor> colors = new List<ImageColor>();
var imagestream = await image.OpenStreamForReadAsync(); // Convert image to stream
var imageDecoder = await BitmapDecoder.CreateAsync(imagestream.AsRandomAccessStream()); // decode stream
var imagePixelData = await imageDecoder.GetPixelDataAsync(); // get information about pixels
var bytes = imagePixelData.DetachPixelData(); // get pixel data
for (int x = 0; x < imageDecoder.PixelWidth; x++)
{
for (int y = 0; y < imageDecoder.PixelHeight; y++)
{
var location = (y * (int)imageDecoder.PixelWidth + x) * 3; // Navigate to corresponding coordinates
var color = Color.FromArgb(0, bytes[location + 0], bytes[location + 1], bytes[location + 2]); // Filter Red Green Blue and convert this to Argb
// find if color already exsists from its hex code
string hex = color.ToString();
var prevColor = colors.FirstOrDefault(a => a.ColorCodeHex == hex);
if (colors.Count == 0 || prevColor == null)
{
// new color
ImageColor imgColor = new ImageColor()
{
R = color.R,
G = color.G,
B = color.B,
ColorCodeHex = hex,
Occurence = 1
};
colors.Add(imgColor);
}
else
{
// exsisting color
prevColor.Occurence++;
}
}
}
return colors;
}
Now, do I really need to go through every single pixel?
And, what I did was test this function using a black image (completely black) and what I got was that there are 4 colors in that picture: black, red, green and blue.
Now the lines where I find the location and color are not mine, I found them online and I can't really verify that this is how you should do it.
Any help guys?
c# uwp
I'm writing a simple tool, the user can select an image and it should list all the colors found in the picture.
Now, I'm facing 2 main issues, one is that it's slow because I'm looping through all the pixels in an image.
Second, I'm getting unexpected results.
First thing's first, the code:
public static async Task<List<ImageColor>> GetImageColorsAsync(StorageFile image)
{
List<ImageColor> colors = new List<ImageColor>();
var imagestream = await image.OpenStreamForReadAsync(); // Convert image to stream
var imageDecoder = await BitmapDecoder.CreateAsync(imagestream.AsRandomAccessStream()); // decode stream
var imagePixelData = await imageDecoder.GetPixelDataAsync(); // get information about pixels
var bytes = imagePixelData.DetachPixelData(); // get pixel data
for (int x = 0; x < imageDecoder.PixelWidth; x++)
{
for (int y = 0; y < imageDecoder.PixelHeight; y++)
{
var location = (y * (int)imageDecoder.PixelWidth + x) * 3; // Navigate to corresponding coordinates
var color = Color.FromArgb(0, bytes[location + 0], bytes[location + 1], bytes[location + 2]); // Filter Red Green Blue and convert this to Argb
// find if color already exsists from its hex code
string hex = color.ToString();
var prevColor = colors.FirstOrDefault(a => a.ColorCodeHex == hex);
if (colors.Count == 0 || prevColor == null)
{
// new color
ImageColor imgColor = new ImageColor()
{
R = color.R,
G = color.G,
B = color.B,
ColorCodeHex = hex,
Occurence = 1
};
colors.Add(imgColor);
}
else
{
// exsisting color
prevColor.Occurence++;
}
}
}
return colors;
}
Now, do I really need to go through every single pixel?
And, what I did was test this function using a black image (completely black) and what I got was that there are 4 colors in that picture: black, red, green and blue.
Now the lines where I find the location and color are not mine, I found them online and I can't really verify that this is how you should do it.
Any help guys?
c# uwp
c# uwp
asked 2 mins ago
user3159792
383
383
add a comment |
add a comment |
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f209332%2fget-pixel-data-from-image-uwp%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown