Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2010, 23:36   #1
insolent
Пользователь
 
Регистрация: 16.03.2009
Сообщений: 15
Печаль Переписать

Есть функция(вроде на C++/CLI) из msdn, нужно её переписать на С++:
Код:
// Create a new bitmap.
   Bitmap^ bmp = gcnew Bitmap( "c:\\fakePhoto.jpg" );

   // Lock the bitmap's bits.  
   Rectangle rect = Rectangle(0,0,bmp->Width,bmp->Height);
   System::Drawing::Imaging::BitmapData^ bmpData = bmp->LockBits( rect, System::Drawing::Imaging::ImageLockMode::ReadWrite, bmp->PixelFormat );

   // Get the address of the first line.
   IntPtr ptr = bmpData->Scan0;

   // Declare an array to hold the bytes of the bitmap.
   // This code is specific to a bitmap with 24 bits per pixels.
   int bytes = bmpData->Stride * bmp->Height;
   array<Byte>^rgbValues = gcnew array<Byte>(bytes);

   // Copy the RGB values into the array.
   System::Runtime::InteropServices::Marshal::Copy( ptr, rgbValues, 0, bytes );

   // Set every third value to 255.  
   for ( int counter = 2; counter < rgbValues->Length; counter += 3 )
      rgbValues[ counter ] = 255;

   // Copy the RGB values back to the bitmap
   System::Runtime::InteropServices::Marshal::Copy( rgbValues, 0, ptr, bytes );

   // Unlock the bits.
   bmp->UnlockBits( bmpData );
Вот мой результат:
Код:
#include <windows.h>
#include <gdiplus.h>
#include <BaseTsd.h>
#include <vector>
#include <algorithm>
#include <fstream>

using namespace Gdiplus;
#pragma comment (lib, "gdiplus.lib")

int main(int argc, char* argv[])
{
	std::ofstream out;
	out.open("test.txt");

	GdiplusStartupInput input;
	ULONG_PTR token;
	GdiplusStartup(&token, &input, NULL);

	Bitmap*     bmp    = new Bitmap(TEXT("1.jpg"));
	BitmapData* bmpData = new BitmapData;

	Rect rect(0, 0, bmp->GetWidth(), bmp->GetHeight());
	bmp->LockBits(&rect, 
		             ImageLockModeRead,
				  bmp->GetPixelFormat(),
				  bmpData);

	UINT* pixels = (UINT*)bmpData->Scan0;

	int bytes = bmpData->Stride * bmp->GetHeight();
	std::vector<BYTE> rgbValues;
	rgbValues.resize(bytes);

	memcpy(&rgbValues[0], pixels, bytes);
	//std::copy(pixels, pixels + bytes, std::back_inserter(rgbValues));

	//if (bmp->GetPixelFormat() == PixelFormat24bppRGB)
		//out << "The pixel format of image is 24bppRGB.\n";

	//for(int i = 0; i < bytes; i++)
		//rgbValues[i] = pixels[i];

	bmp->UnlockBits(bmpData);

	delete bmp;
	delete bmpData;
	GdiplusShutdown(token);

	out << rgbValues[0] << " "
		<< rgbValues[1] << " "
		<< rgbValues[2];

	system("PAUSE");
	return 0;
}
В вектор получаем шлак, а должны быть данные о значениях составляющие цвет каждого пикселя.
Если копировать с помощью сору, то выбивает ошибку
2.png

Последний раз редактировалось insolent; 22.08.2010 в 23:39.
insolent вне форума Ответить с цитированием
Старый 23.08.2010, 15:10   #2
evgn
Разрабатываюсь....
Пользователь
 
Регистрация: 16.11.2008
Сообщений: 68
По умолчанию

-------------------
evgn вне форума Ответить с цитированием
Старый 23.08.2010, 17:26   #3
insolent
Пользователь
 
Регистрация: 16.03.2009
Сообщений: 15
По умолчанию

evgn, что вы этих хотели сказать??
insolent вне форума Ответить с цитированием
Старый 23.08.2010, 17:48   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вроде так, используя gdiplus разумеется
Код:
using namespace Gdiplus;

Bitmap *bmp = new Bitmap(L"c:\\fakePhoto.jpg");
Rect rect(0, 0, bmp->GetWidth(), bmp->GetHeight());

BitmapData bmpData;
bmp->LockBits(&rect, ImageLockModeRead | ImageLockModeWrite, PixelFormat24bppRGB, &bmpData);

int bytes = bmpData.Stride * bmpData.Height;

for (int counter = 2; counter < bytes; counter += 3)
{
	((char*)bmpData.Scan0)[counter] = (unsigned char)0xff;
}

bmp->UnlockBits(&bmpData);
p.s. средненький такой вариант, думаю даже можно сделать еще быстрее, к примеру не массив использовать в цикле, а прямой указатель и постепенно его наращивать при каждой итерации
BOBAH13 вне форума Ответить с цитированием
Старый 23.08.2010, 22:56   #5
insolent
Пользователь
 
Регистрация: 16.03.2009
Сообщений: 15
По умолчанию

BOBAH13, первый пример из сайта мелкомягких, мне необходимо получить значения составляющих пиксели картинки. Так как не умею работать с C++/CLI, то первій пример переписываю на С++. Но есть проблемы(
insolent вне форума Ответить с цитированием
Старый 24.08.2010, 13:50   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Что то я не пойму, я же вам перевел на С++, что еще не так?
BOBAH13 вне форума Ответить с цитированием
Старый 24.08.2010, 14:32   #7
insolent
Пользователь
 
Регистрация: 16.03.2009
Сообщений: 15
По умолчанию

BOBAH13, спасибо за помощь, я уже сам разобрался)
insolent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переписать код bp C++, на Delphi Айдар Общие вопросы Delphi 0 12.06.2010 20:40
Как переписать проги на С# PDV199003 Помощь студентам 0 04.06.2010 15:56
переписать программу с VB на delphi qpush Помощь студентам 1 21.04.2010 23:57
Переписать из VBA в Delphi Андрюха из ПХТТ Фриланс 4 07.05.2009 20:40