View Full Version : سوال: باز کردن عکس و خواندن پیکسل ها در ++c
  
vertionality
دوشنبه 11 تیر 1397, 18:04 عصر
سلام
ایا در ++c می شود یک فایل عکس باز کرد ؟ :متفکر:
من می خواهم یک عکس را ورودی بگیرم و کد های rgb پیکسل های عکس را خروجی بدهم . 
ممنون
farhad_shiri_ex
سه شنبه 12 تیر 1397, 03: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, 11: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, 11:28 صبح
توی پایتون خیلی راحت است با یکی دو خط کد کار تموم میشه ولی خروجی
exe ای که میده مثل ++c فشرده نیست و سرعت پایینی هم داره . ( 10 برابر کمتر )
ولی الان چه جوری میشه یک عکس باز کرد ؟ چون این تابع ورودی نگرفته . ممنون
farhad_shiri_ex
سه شنبه 26 تیر 1397, 06:43 صبح
توی پایتون خیلی راحت است با یکی دو خط کد کار تموم میشه ولی خروجی
exe ای که میده مثل ++c فشرده نیست و سرعت پایینی هم داره . ( 10 برابر کمتر )
ولی الان چه جوری میشه یک عکس باز کرد ؟ چون این تابع ورودی نگرفته . ممنون
کدی که گذاشتم با CLANG(تو کدبلاکز LLVM CLANG هست) کامپایل میشه و در ضمن لایبرری هم هست خروجی exe نمیتونه داشته باشه و اگر خواستید بگید من فایل لایبرری را براتون پی ام میکنم و اینکه شما گفیتید میتونم من هم براتون نمونه گذاشتم که میتونید.
vertionality
سه شنبه 26 تیر 1397, 14:55 عصر
کدی که گذاشتم با CLANG(تو کدبلاکز LLVM CLANG هست) کامپایل میشه و در ضمن لایبرری هم هست خروجی exe نمیتونه داشته باشه و اگر خواستید بگید من فایل لایبرری را براتون پی ام میکنم و اینکه شما گفیتید میتونم من هم براتون نمونه گذاشتم که میتونید.
دست شما درد نکنه . اره اره حتما پی ام کنید . من الان qt ریختم 
خیلی خوبه . کد بلاکس کلا به درد نمیخوره . من opencv , dlib, imagemagick ,im
را امتحان کردم نتونستم اجرا کنم هر کدام ide مخصوص خودش را میخواست برای کامپایل .
دست شما درد نکنه
farhad_shiri_ex
پنج شنبه 28 تیر 1397, 04:06 صبح
خیلی خوبه . کد بلاکس کلا به درد نمیخوره
دوست عزیز!
QT یک فریم وورک هست ! CodeBlocks یک محیط توسعه کراس پلت فرم هست که اتفاقا بسیار بسیار هم قوی و انعطاف پذیر حتی از ویژوال استودیو ویا حتی از محیط توسعه Qt البته اینم بگم از نقطه نظر برنامه نویسی عرض میکنم وگرنه برای ساخت برنامه های تحت دات نت البته که ویژوال استودیو عالی هست.
فقط نکته ای که در محیط های توسعه ای به غیر از ویژوال استودیو هست مثل همین CodeBlocks ویا ++DevC استفاده از کامپایلر های مناسب برای برنامه تون هست چون در ویژوال استودیو با یک کامپایلر سر کار دارید خیلی متوچه این اشکلات نمیشید ولی در محیط های دیگه یکم سخت تر هست مدیریت کد 
مثال اگر شما کدی با کامپایلر های gcc برای ویندوز کد بنویسید و در کدبلاکز ویندوز اجرا بشه ! حالا همین کد رو اگر روی توزیع های مختلف بخواهید اجرا کنید با همون کامپایلر gcc و البته کدبلاکز تحت لینوکس به احتمال زیاد باید یکم تغییرات روی کدتون اعمال کنید تا کار کنه.
حالا اگر از کامپایلرهای استاندارد دیگه مثل CLANG استفاده کنید هم همین داستان هست برای حفظ قابلیت حمل پذیری کدهاتون...
البته در Qt داستان کمی متفاوت تر هست و این قضیه حفظ یکپارچگی کامپایلرها به این علت که در تمامی سیستم عامل ها توسط خود Qt ریلیز میشه خیلی بهتر هست و 98 درصد کد های برنامه در کیوت تحت ویندوز به راحتی در اکثر توزیع های لینوکس هم کار میکنه ویا حتی مکینتاش..
حالا همه این داستا نها یکطرف استفاده از ++Modern C در این محیطها یکطرف انوقت مبینید که بهترین محیط توسعه برای این نوع برنامه نویسی ویژوال استودیو 2015 به بعد هست که حالا بماند...
وهمین مسائل هست که شاید برخی فکر کنند که محیطهای مثل codeBlocks خوب نیستند.
البته صرفا جهت اطلاع عرض کردم
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.