PDA

View Full Version : سوال: باز کردن عکس و خواندن پیکسل ها در ++c



vertionality
دوشنبه 11 تیر 1397, 17:04 عصر
سلام

ایا در ++c می شود یک فایل عکس باز کرد ؟ :متفکر:

من می خواهم یک عکس را ورودی بگیرم و کد های rgb پیکسل های عکس را خروجی بدهم .

ممنون

farhad_shiri_ex
سه شنبه 12 تیر 1397, 02:25 صبح
سلام

ایا در ++c می شود یک فایل عکس باز کرد ؟ :متفکر:

من می خواهم یک عکس را ورودی بگیرم و کد های rgb پیکسل های عکس را خروجی بدهم .

ممنون

خوب معلوم که میشود یک درصد فکر کن نشه!!!
منتهی با چه کامپایلری و تو کدوم IDE تو چه سیستم عاملی منظورتون هست؟
برای مثال این برنامه یکسری افکت بر روی یک bitmap اجرا میکنه...


#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* Set to 1 to enable debug log traces. */
#define DEBUG 0

/* Set to 1 to optimize memory stores when generating plasma. */
#define OPTIMIZE_WRITES 1

/* Return current time in milliseconds */
static double now_ms(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec*1000. + tv.tv_usec/1000.;
}

typedef int32_t Fixed;

#define FIXED_BITS 16
#define FIXED_ONE (1 << FIXED_BITS)
#define FIXED_AVERAGE(x,y) (((x) + (y)) >> 1)

#define FIXED_FROM_INT(x) ((x) << FIXED_BITS)
#define FIXED_TO_INT(x) ((x) >> FIXED_BITS)

#define FIXED_FROM_FLOAT(x) ((Fixed)((x)*FIXED_ONE))
#define FIXED_TO_FLOAT(x) ((x)/(1.*FIXED_ONE))

#define FIXED_MUL(x,y) (((int64_t)(x) * (y)) >> FIXED_BITS)
#define FIXED_DIV(x,y) (((int64_t)(x) * FIXED_ONE) / (y))

#define FIXED_DIV2(x) ((x) >> 1)
#define FIXED_AVERAGE(x,y) (((x) + (y)) >> 1)

#define FIXED_FRAC(x) ((x) & ((1 << FIXED_BITS)-1))
#define FIXED_TRUNC(x) ((x) & ~((1 << FIXED_BITS)-1))

#define FIXED_FROM_INT_FLOAT(x,f) (Fixed)((x)*(FIXED_ONE*(f)))

typedef int32_t Angle;

#define ANGLE_BITS 9

#if ANGLE_BITS < 8
# error ANGLE_BITS must be at least 8
#endif

#define ANGLE_2PI (1 << ANGLE_BITS)
#define ANGLE_PI (1 << (ANGLE_BITS-1))
#define ANGLE_PI2 (1 << (ANGLE_BITS-2))
#define ANGLE_PI4 (1 << (ANGLE_BITS-3))

#define ANGLE_FROM_FLOAT(x) (Angle)((x)*ANGLE_PI/M_PI)
#define ANGLE_TO_FLOAT(x) ((x)*M_PI/ANGLE_PI)

#if ANGLE_BITS <= FIXED_BITS
# define ANGLE_FROM_FIXED(x) (Angle)((x) >> (FIXED_BITS - ANGLE_BITS))
# define ANGLE_TO_FIXED(x) (Fixed)((x) << (FIXED_BITS - ANGLE_BITS))
#else
# define ANGLE_FROM_FIXED(x) (Angle)((x) << (ANGLE_BITS - FIXED_BITS))
# define ANGLE_TO_FIXED(x) (Fixed)((x) >> (ANGLE_BITS - FIXED_BITS))
#endif

static Fixed angle_sin_tab[ANGLE_2PI+1];

static void init_angles(void)
{
int nn;
for (nn = 0; nn < ANGLE_2PI+1; nn++) {
double radians = nn*M_PI/ANGLE_PI;
angle_sin_tab[nn] = FIXED_FROM_FLOAT(sin(radians));
}
}

static __inline__ Fixed angle_sin( Angle a )
{
return angle_sin_tab[(uint32_t)a & (ANGLE_2PI-1)];
}

static __inline__ Fixed angle_cos( Angle a )
{
return angle_sin(a + ANGLE_PI2);
}

static __inline__ Fixed fixed_sin( Fixed f )
{
return angle_sin(ANGLE_FROM_FIXED(f));
}

static __inline__ Fixed fixed_cos( Fixed f )
{
return angle_cos(ANGLE_FROM_FIXED(f));
}

/* Color palette used for rendering the plasma */
#define PALETTE_BITS 8
#define PALETTE_SIZE (1 << PALETTE_BITS)

#if PALETTE_BITS > FIXED_BITS
# error PALETTE_BITS must be smaller than FIXED_BITS
#endif

static uint16_t palette[PALETTE_SIZE];

static uint16_t make565(int red, int green, int blue)
{
return (uint16_t)( ((red << 8) & 0xf800) |
((green << 3) & 0x07e0) |
((blue >> 3) & 0x001f) );
}

static void init_palette(void)
{
int nn, mm = 0;
/* fun with colors */
for (nn = 0; nn < PALETTE_SIZE/4; nn++) {
int jj = (nn-mm)*4*255/PALETTE_SIZE;
palette[nn] = make565(255, jj, 255-jj);
}

for ( mm = nn; nn < PALETTE_SIZE/2; nn++ ) {
int jj = (nn-mm)*4*255/PALETTE_SIZE;
palette[nn] = make565(255-jj, 255, jj);
}

for ( mm = nn; nn < PALETTE_SIZE*3/4; nn++ ) {
int jj = (nn-mm)*4*255/PALETTE_SIZE;
palette[nn] = make565(0, 255-jj, 255);
}

for ( mm = nn; nn < PALETTE_SIZE; nn++ ) {
int jj = (nn-mm)*4*255/PALETTE_SIZE;
palette[nn] = make565(jj, 0, 255);
}
}

static __inline__ uint16_t palette_from_fixed( Fixed x )
{
if (x < 0) x = -x;
if (x >= FIXED_ONE) x = FIXED_ONE-1;
int idx = FIXED_FRAC(x) >> (FIXED_BITS - PALETTE_BITS);
return palette[idx & (PALETTE_SIZE-1)];
}

/* Angles expressed as fixed point radians */

static void init_tables(void)
{
init_palette();
init_angles();
}

static void fill_plasma( AndroidBitmapInfo* info, void* pixels, double t )
{
Fixed yt1 = FIXED_FROM_FLOAT(t/1230.);
Fixed yt2 = yt1;
Fixed xt10 = FIXED_FROM_FLOAT(t/3000.);
Fixed xt20 = xt10;

#define YT1_INCR FIXED_FROM_FLOAT(1/100.)
#define YT2_INCR FIXED_FROM_FLOAT(1/163.)

int yy;
for (yy = 0; yy < info->height; yy++) {
uint16_t* line = (uint16_t*)pixels;
Fixed base = fixed_sin(yt1) + fixed_sin(yt2);
Fixed xt1 = xt10;
Fixed xt2 = xt20;

yt1 += YT1_INCR;
yt2 += YT2_INCR;

#define XT1_INCR FIXED_FROM_FLOAT(1/173.)
#define XT2_INCR FIXED_FROM_FLOAT(1/242.)

#if OPTIMIZE_WRITES

uint16_t* line_end = line + info->width;

if (line < line_end) {
if (((uint32_t)(uintptr_t)line & 3) != 0) {
Fixed ii = base + fixed_sin(xt1) + fixed_sin(xt2);

xt1 += XT1_INCR;
xt2 += XT2_INCR;

line[0] = palette_from_fixed(ii >> 2);
line++;
}

while (line + 2 <= line_end) {
Fixed i1 = base + fixed_sin(xt1) + fixed_sin(xt2);
xt1 += XT1_INCR;
xt2 += XT2_INCR;

Fixed i2 = base + fixed_sin(xt1) + fixed_sin(xt2);
xt1 += XT1_INCR;
xt2 += XT2_INCR;

uint32_t pixel = ((uint32_t)palette_from_fixed(i1 >> 2) << 16) |
(uint32_t)palette_from_fixed(i2 >> 2);

((uint32_t*)line)[0] = pixel;
line += 2;
}

if (line < line_end) {
Fixed ii = base + fixed_sin(xt1) + fixed_sin(xt2);
line[0] = palette_from_fixed(ii >> 2);
line++;
}
}
#else /* !OPTIMIZE_WRITES */
int xx;
for (xx = 0; xx < info->width; xx++) {

Fixed ii = base + fixed_sin(xt1) + fixed_sin(xt2);

xt1 += XT1_INCR;
xt2 += XT2_INCR;

line[xx] = palette_from_fixed(ii / 4);
}
#endif /* !OPTIMIZE_WRITES */

// go to next line
pixels = (char*)pixels + info->stride;
}
}

/* simple stats management */
typedef struct {
double renderTime;
double frameTime;
} FrameStats;

#define MAX_FRAME_STATS 200
#define MAX_PERIOD_MS 1500

typedef struct {
double firstTime;
double lastTime;
double frameTime;

int firstFrame;
int numFrames;
FrameStats frames[ MAX_FRAME_STATS ];
} Stats;

static void
stats_init( Stats* s )
{
s->lastTime = now_ms();
s->firstTime = 0.;
s->firstFrame = 0;
s->numFrames = 0;
}

static void
stats_startFrame( Stats* s )
{
s->frameTime = now_ms();
}

static void
stats_endFrame( Stats* s )
{
double now = now_ms();
double renderTime = now - s->frameTime;
double frameTime = now - s->lastTime;
int nn;

if (now - s->firstTime >= MAX_PERIOD_MS) {
if (s->numFrames > 0) {
double minRender, maxRender, avgRender;
double minFrame, maxFrame, avgFrame;
int count;

nn = s->firstFrame;
minRender = maxRender = avgRender = s->frames[nn].renderTime;
minFrame = maxFrame = avgFrame = s->frames[nn].frameTime;
for (count = s->numFrames; count > 0; count-- ) {
nn += 1;
if (nn >= MAX_FRAME_STATS)
nn -= MAX_FRAME_STATS;
double render = s->frames[nn].renderTime;
if (render < minRender) minRender = render;
if (render > maxRender) maxRender = render;
double frame = s->frames[nn].frameTime;
if (frame < minFrame) minFrame = frame;
if (frame > maxFrame) maxFrame = frame;
avgRender += render;
avgFrame += frame;
}
avgRender /= s->numFrames;
avgFrame /= s->numFrames;

LOGI("frame/s (avg,min,max) = (%.1f,%.1f,%.1f) "
"render time ms (avg,min,max) = (%.1f,%.1f,%.1f)\n",
1000./avgFrame, 1000./maxFrame, 1000./minFrame,
avgRender, minRender, maxRender);
}
s->numFrames = 0;
s->firstFrame = 0;
s->firstTime = now;
}

nn = s->firstFrame + s->numFrames;
if (nn >= MAX_FRAME_STATS)
nn -= MAX_FRAME_STATS;

s->frames[nn].renderTime = renderTime;
s->frames[nn].frameTime = frameTime;

if (s->numFrames < MAX_FRAME_STATS) {
s->numFrames += 1;
} else {
s->firstFrame += 1;
if (s->firstFrame >= MAX_FRAME_STATS)
s->firstFrame -= MAX_FRAME_STATS;
}

s->lastTime = now;
}

vertionality
سه شنبه 12 تیر 1397, 10:10 صبح
دستت درد نکنه ، فقط من از codeblocks استفاده کردم نتونستم خروجی بگیرم .

من کلا در اخرش می خواهم یک فایل exe بسازم و برای نوع ide خیلی مهم نیست همین که

در اخر خروجی exe بده کافیه ( احتمالا بعدا qt نصب کنم ) ولی فعلا codeblocks دارم .

شما از چه ide استفاده می کنید ؟ الان دیفالت این کد را اجرا می کنه ؟

من میخواهم ++c بنویسم سرعتش بهتره الان مشکلی نداره که این

کد برای c هست ؟ چون h. داره اخر کتابخونه ها . ممنون

من با ++c اجرا کردم ارور زیر را داد :



||=== Build: Debug in test (compiler: GNU GCC Compiler) ===|
D:\Program\CodeBlocks\project\test\main.cpp||In function 'double now_ms()':|
D:\Program\CodeBlocks\project\test\main.cpp|15|err or: aggregate 'now_ms()::timeval tv' has incomplete type and cannot be defined|
D:\Program\CodeBlocks\project\test\main.cpp|16|err or: 'gettimeofday' was not declared in this scope|
D:\Program\CodeBlocks\project\test\main.cpp|20|err or: 'int32_t' does not name a type|
D:\Program\CodeBlocks\project\test\main.cpp|43|err or: 'int32_t' does not name a type|
D:\Program\CodeBlocks\project\test\main.cpp|67|err or: 'Fixed' does not name a type|
D:\Program\CodeBlocks\project\test\main.cpp||In function 'void init_angles()':|
D:\Program\CodeBlocks\project\test\main.cpp|74|err or: 'angle_sin_tab' was not declared in this scope|
D:\Program\CodeBlocks\project\test\main.cpp|29|err or: 'Fixed' was not declared in this scope|
D:\Program\CodeBlocks\project\test\main.cpp|74|not e: in expansion of macro 'FIXED_FROM_FLOAT'|
D:\Program\CodeBlocks\project\test\main.cpp|78|err or: 'Fixed' does not name a type|
D:\Program\CodeBlocks\project\test\main.cpp|83|err or: 'Fixed' does not name a type|
D:\Program\CodeBlocks\project\test\main.cpp|88|err or: 'Fixed' does not name a type|
D:\Program\CodeBlocks\project\test\main.cpp|93|err or: 'Fixed' does not name a type|
D:\Program\CodeBlocks\project\test\main.cpp|106|er ror: 'uint16_t' does not name a type|
D:\Program\CodeBlocks\project\test\main.cpp|108|er ror: 'uint16_t' does not name a type|
D:\Program\CodeBlocks\project\test\main.cpp||In function 'void init_palette()':|
D:\Program\CodeBlocks\project\test\main.cpp|121|er ror: 'palette' was not declared in this scope|
D:\Program\CodeBlocks\project\test\main.cpp|121|er ror: 'make565' was not declared in this scope|
D:\Program\CodeBlocks\project\test\main.cpp|126|er ror: 'palette' was not declared in this scope|
D:\Program\CodeBlocks\project\test\main.cpp|126|er ror: 'make565' was not declared in this scope|
D:\Program\CodeBlocks\project\test\main.cpp|131|er ror: 'palette' was not declared in this scope|
D:\Program\CodeBlocks\project\test\main.cpp|131|er ror: 'make565' was not declared in this scope|
D:\Program\CodeBlocks\project\test\main.cpp|136|er ror: 'palette' was not declared in this scope|
D:\Program\CodeBlocks\project\test\main.cpp|136|er ror: 'make565' was not declared in this scope|
D:\Program\CodeBlocks\project\test\main.cpp|140|er ror: 'uint16_t' does not name a type|
D:\Program\CodeBlocks\project\test\main.cpp|156|er ror: variable or field 'fill_plasma' declared void|
D:\Program\CodeBlocks\project\test\main.cpp|156|er ror: 'AndroidBitmapInfo' was not declared in this scope|
D:\Program\CodeBlocks\project\test\main.cpp|156|er ror: 'info' was not declared in this scope|
D:\Program\CodeBlocks\project\test\main.cpp|156|er ror: expected primary-expression before 'void'|
D:\Program\CodeBlocks\project\test\main.cpp|156|er ror: expected primary-expression before 'double'|
D:\Program\CodeBlocks\project\test\main.cpp|150|wa rning: 'void init_tables()' defined but not used [-Wunused-function]|
D:\Program\CodeBlocks\project\test\main.cpp|13|war ning: 'double now_ms()' defined but not used [-Wunused-function]|
||=== Build failed: 27 error(s), 2 warning(s) (0 minute(s), 1 second(s)) ===|



با c اجرا کردم این یکی :




||=== Build file: "no target" in "no project" (compiler: unknown) ===|
D:\Program\CodeBlocks\project\C\main.c||In function 'now_ms':|
D:\Program\CodeBlocks\project\C\main.c|15|error: storage size of 'tv' isn't known|
D:\Program\CodeBlocks\project\C\main.c|16|warning: implicit declaration of function 'gettimeofday' [-Wimplicit-function-declaration]|
D:\Program\CodeBlocks\project\C\main.c|20|error: unknown type name 'int32_t'|
D:\Program\CodeBlocks\project\C\main.c|43|error: unknown type name 'int32_t'|
D:\Program\CodeBlocks\project\C\main.c||In function 'angle_sin':|
D:\Program\CodeBlocks\project\C\main.c|80|error: 'uint32_t' undeclared (first use in this function)|
D:\Program\CodeBlocks\project\C\main.c|80|note: each undeclared identifier is reported only once for each function it appears in|
D:\Program\CodeBlocks\project\C\main.c|80|error: expected ']' before 'a'|
D:\Program\CodeBlocks\project\C\main.c|106|error: unknown type name 'uint16_t'|
D:\Program\CodeBlocks\project\C\main.c|108|error: unknown type name 'uint16_t'|
D:\Program\CodeBlocks\project\C\main.c||In function 'make565':|
D:\Program\CodeBlocks\project\C\main.c|110|error: 'uint16_t' undeclared (first use in this function)|
D:\Program\CodeBlocks\project\C\main.c|140|error: unknown type name 'uint16_t'|
D:\Program\CodeBlocks\project\C\main.c|156|error: unknown type name 'AndroidBitmapInfo'|
D:\Program\CodeBlocks\project\C\main.c||In function 'stats_endFrame':|
D:\Program\CodeBlocks\project\C\main.c|301|warning : implicit declaration of function 'LOGI' [-Wimplicit-function-declaration]|
||=== Build failed: 10 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|

vertionality
سه شنبه 12 تیر 1397, 10:28 صبح
توی پایتون خیلی راحت است با یکی دو خط کد کار تموم میشه ولی خروجی

exe ای که میده مثل ++c فشرده نیست و سرعت پایینی هم داره . ( 10 برابر کمتر )

ولی الان چه جوری میشه یک عکس باز کرد ؟ چون این تابع ورودی نگرفته . ممنون

farhad_shiri_ex
سه شنبه 26 تیر 1397, 05:43 صبح
توی پایتون خیلی راحت است با یکی دو خط کد کار تموم میشه ولی خروجی

exe ای که میده مثل ++c فشرده نیست و سرعت پایینی هم داره . ( 10 برابر کمتر )

ولی الان چه جوری میشه یک عکس باز کرد ؟ چون این تابع ورودی نگرفته . ممنون

کدی که گذاشتم با CLANG(تو کدبلاکز LLVM CLANG هست) کامپایل میشه و در ضمن لایبرری هم هست خروجی exe نمیتونه داشته باشه و اگر خواستید بگید من فایل لایبرری را براتون پی ام میکنم و اینکه شما گفیتید میتونم من هم براتون نمونه گذاشتم که میتونید.

vertionality
سه شنبه 26 تیر 1397, 13:55 عصر
کدی که گذاشتم با CLANG(تو کدبلاکز LLVM CLANG هست) کامپایل میشه و در ضمن لایبرری هم هست خروجی exe نمیتونه داشته باشه و اگر خواستید بگید من فایل لایبرری را براتون پی ام میکنم و اینکه شما گفیتید میتونم من هم براتون نمونه گذاشتم که میتونید.

دست شما درد نکنه . اره اره حتما پی ام کنید . من الان qt ریختم

خیلی خوبه . کد بلاکس کلا به درد نمیخوره . من opencv , dlib, imagemagick ,im

را امتحان کردم نتونستم اجرا کنم هر کدام ide مخصوص خودش را میخواست برای کامپایل .

دست شما درد نکنه

farhad_shiri_ex
پنج شنبه 28 تیر 1397, 03:06 صبح
خیلی خوبه . کد بلاکس کلا به درد نمیخوره

دوست عزیز!
QT یک فریم وورک هست ! CodeBlocks یک محیط توسعه کراس پلت فرم هست که اتفاقا بسیار بسیار هم قوی و انعطاف پذیر حتی از ویژوال استودیو ویا حتی از محیط توسعه Qt البته اینم بگم از نقطه نظر برنامه نویسی عرض میکنم وگرنه برای ساخت برنامه های تحت دات نت البته که ویژوال استودیو عالی هست.
فقط نکته ای که در محیط های توسعه ای به غیر از ویژوال استودیو هست مثل همین CodeBlocks ویا ++DevC استفاده از کامپایلر های مناسب برای برنامه تون هست چون در ویژوال استودیو با یک کامپایلر سر کار دارید خیلی متوچه این اشکلات نمیشید ولی در محیط های دیگه یکم سخت تر هست مدیریت کد
مثال اگر شما کدی با کامپایلر های gcc برای ویندوز کد بنویسید و در کدبلاکز ویندوز اجرا بشه ! حالا همین کد رو اگر روی توزیع های مختلف بخواهید اجرا کنید با همون کامپایلر gcc و البته کدبلاکز تحت لینوکس به احتمال زیاد باید یکم تغییرات روی کدتون اعمال کنید تا کار کنه.
حالا اگر از کامپایلرهای استاندارد دیگه مثل CLANG استفاده کنید هم همین داستان هست برای حفظ قابلیت حمل پذیری کدهاتون...
البته در Qt داستان کمی متفاوت تر هست و این قضیه حفظ یکپارچگی کامپایلرها به این علت که در تمامی سیستم عامل ها توسط خود Qt ریلیز میشه خیلی بهتر هست و 98 درصد کد های برنامه در کیوت تحت ویندوز به راحتی در اکثر توزیع های لینوکس هم کار میکنه ویا حتی مکینتاش..
حالا همه این داستا نها یکطرف استفاده از ++Modern C در این محیطها یکطرف انوقت مبینید که بهترین محیط توسعه برای این نوع برنامه نویسی ویژوال استودیو 2015 به بعد هست که حالا بماند...
وهمین مسائل هست که شاید برخی فکر کنند که محیطهای مثل codeBlocks خوب نیستند.
البته صرفا جهت اطلاع عرض کردم