سؤال

وأنا بحاجة إلى دراسة صورة GIF في برنامج C. كنت قد بحثت في المكتبة FreeImage ولكن لا يمكنني معرفة ذلك. هل يمكن لشخص يعطي مثال باستخدام FreeImage للوصول الى جميع التفاصيل الصغيرة حول صورة GIF مثل الإطارات، الخلفية، الشفافية، الخ ... وكيفية زيادة من خلال الأطر والحصول على الرسوم المتحركة الحالية صورة / بكسل. المشكلة أواجه هو أن تقوم بتحميل صورة إلى نوع FIMULTIBITMAP، في حين أن معظم وظائف اتخاذ نوع FIBITMAP. أنا لا نرى كيف كنت من المفترض أن استخدام المكتبة مع صور متحركة.

وبالإضافة إلى ذلك، هناك مكتبة أبسط؟

وقال فيروتشيو لاستخدام يبغد. وإليك ما وجدت مع هذه المكتبة.

/* These read the first frame only */
BGD_DECLARE(gdImagePtr) gdImageCreateFromGif (FILE * fd);

وأنا في حاجة إلى كل من الإطارات.

وفيما يلي هو نوع من العمل. المشكلة هي تغيير عرض / ارتفاع الصورة ليكون أصغر من الصورة الفعلية. اعتقد انها مجرد عرض ما تغير، ولكن لست متأكدا من كيفية تعيين أن يعود على الصورة الأصلية لجعل أي استخدام تكنولوجيا المعلومات. وهنا المتحركة الملف .

والواقع هذا المكتبة لا تعمل مثل أفترض أنه من المفترض أن يعمل. على سبيل المثال، لا أستطيع الحصول على لوحة للصورة. ما يحصل هو كل الأصفار. أي اقتراحات بشأن ذلك؟

#include <stdio.h>
#include <string.h>
#include <FreeImage.h>

int main(int argc, char *argv) {
        FIMULTIBITMAP *src;
        src = FreeImage_OpenMultiBitmap(FIF_GIF, "clock_logo_ani.gif", FALSE, TRUE, FALSE, GIF_DEFAULT);

        int count = FreeImage_GetPageCount(src);
        int page, i, row, col, background, transparent;
        RGBQUAD bkcolor;
        BYTE pixel;

        char buffer[25*16 + 16];

        RGBQUAD *palette;

        background = 0;
        for(page = 0; page < count; page++) {
            FIBITMAP *dib = FreeImage_LockPage(src, page);
            if(dib) {
                printf("%dx%d\n", FreeImage_GetHeight(dib), FreeImage_GetWidth(dib));
                FreeImage_GetBackgroundColor(dib, &bkcolor);
                background = (&bkcolor)->rgbReserved;
                transparent = FreeImage_GetTransparentIndex(dib);
                memset(buffer, ' ', sizeof(char) * 24 * 16 + 17 * sizeof(char));
                for( row = 0; row < 16; row++ ) {
                        for( col = 0; col < 24; col++ ) {
                                if ( FreeImage_GetPixelIndex(dib, col, row, &pixel) ) {
                                        if((int)pixel != 0)
                                                buffer[row * 25 + col] = '.';
                                }

                        }
                }
                for (row = 0; row < 16; row++)
                        buffer[row * 25 + 25] = '\n';
                buffer[row * 25] = '\0';
                printf("-----\n%s\n-----\n", buffer);
                FreeImage_UnlockPage(src, dib, FALSE);
            }
        }

        FreeImage_CloseMultiBitmap(src, GIF_DEFAULT);
}

إليك الإخراج. لاحظ كيفية تغير حجم الصورة.

16x24
-----
           ...           
        ..   ..         
       .       .        
      .         .       
     .           .      
     .           .      
    .             .     
    .      ...    .     
    .      .      .     
     .     .     .      
     .     .     .      
      .    .    .       
       .       .        
        ..   ..         
          ...           

-----
4x4
-----
 .                       
 .                      
  .                     













-----
4x3
-----
...                      















-----
4x3
-----
  .                      
.                       

.                       












-----
4x4
-----
.                        















-----
4x4
-----


.                       
 .                      












-----
4x4
-----



...                     












-----
4x4
-----

  .                     
 .                      
.                       












-----
هل كانت مفيدة؟

المحلول

في رمز المدرجة في سؤالك، بمجرد قفل الصفحة، يمكنك القيام به:

bool isTransparent=FreeImage_IsTransparent(dib);
RGBQUAD* bkcolor;
bool didIGetBackgroundCorrectly=FreeImage_GetBackgroundColor(dib, bkcolor);

والمؤشر الذي يعطي FreeImage_LockPage لك هو الصورة التي الإطار. يجب أن تكون قادرا على استخدامها في أي من الوظائف الأخرى التي تأخذ نوع FIBITMAP. (ولكن تذكر، في رمز أعلاه، يمكنك فتحه للقراءة فقط)

وتعلمون كم هي الأطر في الرسوم المتحركة، "العد" يمنحك ذلك. (صفر مقرها، وبطبيعة الحال) وهو بسيط جدا.

نصائح أخرى

ولقد كان حظا سعيدا مع يبغد .

إذا كنت على استعداد لاستخدام ج ++، يماغيماغيك ديه ارتباطات للقيام بذلك. أنه يحتوي على واجهة برمجة التطبيقات (ج)، ولكن لا أرى أي وظائف للقيام بذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top