LibGD 库不工作:保存图像时崩溃

Posted

技术标签:

【中文标题】LibGD 库不工作:保存图像时崩溃【英文标题】:LibGD library is not working: crash when saving image 【发布时间】:2010-02-21 23:43:38 【问题描述】:

我一直在为 c++ 寻找 JPG 保存库很长时间,但我似乎无法得到任何工作。现在我正在尝试使用 LibGD:

我做错了什么?它似乎有效,但保存崩溃。代码:

...
#pragma comment(lib, "bgd.lib")


#include <gd/gd.h>

...

void save_test()
    gdImagePtr im;
    FILE *jpegout;
    int black;
    int white;
    im = gdImageCreateTrueColor(64, 64);

    black = gdImageColorAllocate(im, 0, 0, 0);
    white = gdImageColorAllocate(im, 255, 255, 255);
    gdImageLine(im, 0, 0, 63, 63, white);

    if(jpegout = fopen("test.jpg", "wb"))
        if(im)
            gdImageJpeg(im, jpegout, -1); // crash here!
        
        fclose(jpegout);
    

    gdImageDestroy(im);

我从以下位置下载了库:http://www.libgd.org/releases/gd-latest-win32.zip

我在正确的目录等中有库/include/bgd.dll 文件。

编辑:下面的答案包括解决我的问题的代码:

int size;
char* data = (char*)gdImagePngPtr(im, &size);
fwrite(data, sizeof(char), size, out);
gdFree(data);

【问题讨论】:

【参考方案1】:

在尝试使用imjpegout 之前检查它们以确保它们都已分配。

[编辑] 最好从测试中拆分分配文件句柄以确保其有效性。你试过the libgd example吗?

[Edit2] 我下载了相同的源等,在 VS2008 中设置了一个项目并得到完全相同的问题。你可以试试this suggestion..

关于 GD 的一个重要事项是确保它是针对与主项目相同的 CRT 构建的,因为它使用诸如 FILE 之类的结构,并且如果您从用另一个版本构建的可执行文件调用用一个版本的编译器构建的 GD DLL,你会遇到内存访问冲突。

里面有一个代码 sn-p 可以修复我机器上的崩溃问题:

/* Bring in gd library functions */
#include "gd.h"

/* Bring in standard I/O so we can output the PNG to a file */
#include <stdio.h>

int main() 
  /* Declare the image */
  gdImagePtr im;
  /* Declare output files */
  FILE *pngout, *jpegout;
  /* Declare color indexes */
  int black;
  int white;

  /* Allocate the image: 64 pixels across by 64 pixels tall */
  im = gdImageCreate(64, 64);

  /* Allocate the color black (red, green and blue all minimum).
    Since this is the first color in a new image, it will
    be the background color. */
  black = gdImageColorAllocate(im, 0, 0, 0);  

  /* Allocate the color white (red, green and blue all maximum). */
  white = gdImageColorAllocate(im, 255, 255, 255);  

  /* Draw a line from the upper left to the lower right,
    using white color index. */
  gdImageLine(im, 0, 0, 63, 63, white);  

  /* Open a file for writing. "wb" means "write binary", important
    under MSDOS, harmless under Unix. */
  errno_t result1 = fopen_s(&pngout, "C:\\Projects\\Experiments\\LibGD\\test.png", "wb");

  /* Do the same for a JPEG-format file. */
  errno_t result2 = fopen_s(&jpegout, "C:\\Projects\\Experiments\\LibGD\\test.jpg", "wb+");

  /* Output the image to the disk file in PNG format. */
  int size;
  char* data = (char*)gdImagePngPtr(im, &size);
  fwrite(data, sizeof(char), size, pngout);
  gdFree(data);

  data = (char*)gdImageJpegPtr(im, &size, -1);
  fwrite(data, sizeof(char), size, jpegout);
  gdFree(data);

  /* Close the files. */
  fclose(pngout);
  fclose(jpegout);

  /* Destroy the image in memory. */
  gdImageDestroy(im);

【讨论】:

是的。我现在更新了我的帖子,它仍然在那条线上崩溃。 是的,我从那个网站取出了代码,顺便说一句,代码完全相同。

以上是关于LibGD 库不工作:保存图像时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

加载 MKMapView 时崩溃

Python 请求库不工作,而 cURL 工作

关系保存时核心数据崩溃

为什么单击保存按钮时我的vba用户表单崩溃?

删除后尝试保存时核心数据崩溃

尝试将图像保存到照片库时,iOS 10 应用程序崩溃