Exemplo n.º 1
0
static void ShootAndSave(int left, int top, int width, int height)
{
    uint8_t* buffer = xmalloc(width * height * 4);

    ShootArea(left, top, width, height, buffer);
    SavePNG(buffer, width, height);

    free(buffer);
}
Exemplo n.º 2
0
/*
==================
R_TakeScreenshotPNG
==================
*/
static void R_TakeScreenshotPNG( int x, int y, int width, int height, char *fileName )
{
	byte *buffer = RB_ReadPixels( x, y, width, height, 0 );

	if ( tr.overbrightBits > 0 && glConfig.deviceSupportsGamma )
	{
		R_GammaCorrect( buffer, 3 * width * height );
	}

	SavePNG( fileName, buffer, width, height, 3, qfalse );
	ri.Hunk_FreeTempMemory( buffer );
}
Exemplo n.º 3
0
//
// Save the image to a file (PPM, JPEG and PNG
// formats are supported).
// Returns a non-zero value on error.
//
STStatus STImage::Save(const std::string& filename) const
{
    // Determine the right routine based on the file's extension.
    // The format-specific subroutines are each implemented in
    // a different file.
    std::string ext = STGetExtension( filename );

    if (ext.compare("PPM") == 0 ) {
        return SavePPM(filename);
    }
    else if (ext.compare("PNG") == 0) {
        return SavePNG(filename);
    }
    else if (ext.compare("JPG") == 0) {
        return SaveJPG(filename);
    }
    else {
        fprintf(stderr,
                "STImage::Save() - Unknown image file type \"%s\".\n",
                filename.c_str());
        assert(false);
        return ST_ERROR;
    } 
}
Exemplo n.º 4
0
//ウィンドウプロシージャ
LRESULT __stdcall WndProc(HWND WindowHandle,UINT Message,WPARAM WParam,LPARAM LParam)
{
	static bool CaptureStarted=false;
	static RECT CaptureRect={0};
	
	switch(Message){
	case WM_RBUTTONDOWN:
		//キャンセル
		DestroyWindow(WindowHandle);
		return DefWindowProc(WindowHandle,Message,WParam,LParam);
		break;
	case WM_TIMER:
		//ESCキー押下の検知
		if(GetKeyState(VK_ESCAPE)&0x8000){
			DestroyWindow(WindowHandle);
			return DefWindowProc(WindowHandle,Message,WParam,LParam);
		}
		break;
	case WM_MOUSEMOVE:
		if(CaptureStarted){
			//新しい座標をセット
			CaptureRect.right=LOWORD(LParam)+OffsetX;
			CaptureRect.bottom=HIWORD(LParam)+OffsetY;
			DrawRubberband(CaptureRect);
		}
		break;
	case WM_LBUTTONDOWN:
		//クリップ開始
		CaptureStarted=true;
		ShowWindow(LayerWindowHandle,SW_SHOW);
		
		//初期位置をセット
		CaptureRect.left=LOWORD(LParam)+OffsetX;
		CaptureRect.top=HIWORD(LParam)+OffsetY;

		//マウスをキャプチャ
		SetCapture(WindowHandle);
		break;
	case WM_LBUTTONUP:
		{
			//クリップ終了
			CaptureStarted=false;
			ShowWindow(LayerWindowHandle,SW_HIDE);
			
			//マウスのキャプチャを解除
			ReleaseCapture();
		
			//新しい座標をセット
			CaptureRect.right=LOWORD(LParam)+OffsetX;
			CaptureRect.bottom=HIWORD(LParam)+OffsetY;

			HDC Hdc,NewHdc;
			HBITMAP NewBitmap;
			Hdc=GetDC(nullptr);

			//画像のキャプチャ
			int Width,Height;
			Width=std::abs(CaptureRect.right-CaptureRect.left+1);
			Height=std::abs(CaptureRect.bottom-CaptureRect.top+1);

			if(!Width||!Height) {
				//画像になってないので何もしない
				ReleaseDC(nullptr,Hdc);
				DestroyWindow(WindowHandle);
				break;
			}

			// ビットマップバッファを作成
			NewBitmap=CreateCompatibleBitmap(Hdc,Width,Height);
			NewHdc=CreateCompatibleDC(Hdc);
			
			//関連づけ
			SelectObject(NewHdc,NewBitmap);

			//画像を取得
			BitBlt(NewHdc,0,0,Width,Height,Hdc,
				CaptureRect.left<CaptureRect.right?CaptureRect.left:CaptureRect.right,
				CaptureRect.top<CaptureRect.bottom?CaptureRect.top:CaptureRect.bottom,SRCCOPY);
			
			//ウィンドウを隠す
			ShowWindow(WindowHandle,SW_HIDE);
			
			//テンポラリファイル名を決定
			std::vector<wchar_t> TempDirectory(MAX_PATH,0),TempFile(MAX_PATH,0);
			GetTempPath(MAX_PATH,TempDirectory.data());
			GetTempFileName(TempDirectory.data(),TempPrefix,0,TempFile.data());
			
			if(SavePNG(TempFile.data(),NewBitmap)) UploadFile(TempFile.data(),ShowBrowser);
			else MessageBox(WindowHandle,L"一時ファイルの保存に失敗しました。",Title,MB_OK|MB_ICONERROR);

			//後始末
			DeleteFile(TempFile.data());
			DeleteDC(NewHdc);
			DeleteObject(NewBitmap);
			ReleaseDC(nullptr,Hdc);
			DestroyWindow(WindowHandle);
		}
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(WindowHandle,Message,WParam,LParam);
	}
	return 0;
}
Exemplo n.º 5
0
int main(int argc, char** argv)
{
	if (argc != 5 && argc != 6 && argc != 7)
	{
		printf("Usage: program SourceJPEG DestJPEG DestWidth DestHeight [bpp] [rotation]\r\n");
		return -1;
	}
	RawImage_t* myImage;
  int bpp = 32;
  int rotation = 0;
  if (argc > 5)
    bpp = atoi(argv[5]);
  if (argc > 6)
    rotation = atoi(argv[6]);
	char* lastDot = strrchr(argv[1], '.');
	if (lastDot && !strcasecmp(lastDot, ".png"))
	{
		FILE* fp = fopen(argv[1], "rb");
		myImage = LoadPNG(fp, atoi(argv[3]), atoi(argv[4]));
		fclose(fp);
	}
	else if (lastDot && !strcasecmp(lastDot, ".gif"))
	{
		int fp = open(argv[1], O_RDONLY | O_BINARY);
		myImage = LoadGIF(fp, atoi(argv[3]), atoi(argv[4]));
		close(fp);
	}
	else if (lastDot && (!strcasecmp(lastDot, ".tif") || !strcasecmp(lastDot, ".tiff")))
	{
		int fp = open(argv[1], O_RDONLY | O_BINARY);
		myImage = LoadTIFF(fp, argv[1], atoi(argv[3]), atoi(argv[4]));
		close(fp);
	}
	else
	{
		FILE* fp = fopen(argv[1], "rb");
		myImage = LoadJPEG(fp, atoi(argv[3]), atoi(argv[4]), bpp, rotation);
		fclose(fp);
	}
	printf("Finished loading image\r\n");fflush(stdout);
	if (!myImage)
	{
		printf("FAILED loading image\r\n");
		return -1;
	}

	FILE* fp = fopen(argv[2], "wb");
	if (strstr(argv[2], ".png"))
	{
		if (SavePNG(myImage, fp))
			printf("FAILED saving PNG image\r\n");
	}
	else if (SaveJPEG(myImage, fp))
	{
		printf("FAILED saving JPEG image\r\n");
	}
	fclose(fp);

	free(myImage->pPlane);
	free(myImage);
	return 0;
}
int main(int argc, char *argv[])
{
  int wid,hgt;
  png_byte type, bits;

  png_bytep *ppData;
  char input[1024];
  char output[1024];
  int result;
  int black_partial = 0;
  int i,j;
  png_byte r,g,b,a;
  png_bytep row;

	// Process the command line
  if (argc < 3) {
		puts("Usage: png_premultiply_alpha {-b} <infile> <outfile>");
  	puts("  -b     Set a pixel with partial transparency to be fully opaque, so it looks like a black outline");
    return -1;
  }
  strncpy(input,argv[argc-2],1024);
  strncpy(output,argv[argc-1],1024);
  if (argc > 3) {
    if (strncmp(argv[argc-3],"-b",2) == 0) {
      black_partial = 1;
    }
  }

  // load the input
  result = LoadPNG(input, &wid,&hgt, &type,&bits, &ppData);
  if (result < 0) {
    puts("Failed to load input file... Aborting");
    return result;
  } else {
    puts("Load successful. Processing...");
  }
  if (type != PNG_COLOR_TYPE_RGB_ALPHA) {
    puts("Could not convert input file to RGBA... Aborting");
    FreePNG(&ppData, hgt);
    return -5;
  }

  // process the file
  for (j = 0; j < hgt; ++j) {
    row = ppData[j];
    for (i = 0; i < wid; ++i) {
      //b = *(row + i*4 + 0);
      //g = *(row + i*4 + 1);
      //r = *(row + i*4 + 2);
      a = *(row + i*4 + 3);
      if (a && (a != 255)) {
        float rf,gf,bf,af;
        //blend the color value based on this value
        r = *(row + i*4 + 0);
        g = *(row + i*4 + 1);
        b = *(row + i*4 + 2);

        rf = ((float)r) / 255.f;
        gf = ((float)g) / 255.f;
        bf = ((float)b) / 255.f;
        af = ((float)a) / 255.f;
        
        r = (png_byte)((rf/af)*255.f);
        g = (png_byte)((gf/af)*255.f);
        b = (png_byte)((bf/af)*255.f);
        if (r > 255) r = 255;
        if (g > 255) r = 255;
        if (b > 255) r = 255;
        
        *(row + i*4 + 0) = r;
        *(row + i*4 + 1) = g;
        *(row + i*4 + 2) = b;
      }
    }
  }

  // write the output
  result = SavePNG(output, wid,hgt, type,bits, ppData);
  if (result < 0) {
    puts("Failed to save output file... Aborting");
  } else {
    puts("Finished... Closing");
  }

  FreePNG(&ppData, hgt);
  return result;
}
Exemplo n.º 7
0
  bool SavePNG(File* file, Image* image) {
    COR_GUARD("SavePNG");

    if (!image) {
      return false;
    }

    // If the image format isn't supported directly by this function,
    // clone to a supported format and try to save with that.
    switch (image->getFormat()) {
      case PF_R8G8B8A8:
      case PF_R8G8B8:
      case PF_I8:
	break;
      default: {
	COR_LOG("Unsupported pixel format... cloning");
	std::auto_ptr<Image> cloned(CloneImage(image, PF_R8G8B8A8));
	return SavePNG(file, cloned.get());
      }
    }

    // create write struct
    png_structp png_ptr = png_create_write_struct(
      PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    if (!png_ptr) {
      return false;
    }

    // error handling!
    if (setjmp(png_jmpbuf(png_ptr))) {
      png_destroy_write_struct(&png_ptr, NULL);
      return false;
    }

    // create info struct
    png_infop info_ptr = png_create_info_struct(png_ptr);
    if (!info_ptr) {
      png_destroy_write_struct(&png_ptr, NULL);
      return false;
    }

    int width  = image->getWidth();
    int height = image->getHeight();

    // set image characteristics
    png_set_write_fn(png_ptr, file, PNG_write, PNG_flush);

    int color_format = 0; // png output format
    int color_format_bpp = 0; // png bytes per pixel
    bool color_format_paletted = false; // png palette needed flag

    // figure out output format
    switch (image->getFormat()) {
      case PF_R8G8B8A8:
        color_format = PNG_COLOR_TYPE_RGB_ALPHA;
        color_format_bpp = 4;
        break;
      case PF_R8G8B8:
        color_format = PNG_COLOR_TYPE_RGB;
        color_format_bpp = 3;
        break;
      case PF_I8:
        color_format = PNG_COLOR_TYPE_PALETTE;
        color_format_bpp = 1;
        color_format_paletted = true;
        break;
      default:
        // Unsupported format.  This should already be taken care of
        // by the test at the beginning of this function.
        return false;
    }
    png_set_IHDR(
      png_ptr, info_ptr,
      width, height,
      8,
      color_format,
      PNG_INTERLACE_NONE,
      PNG_COMPRESSION_TYPE_DEFAULT,
      PNG_FILTER_TYPE_DEFAULT);

    if (color_format_paletted) {
      COR_LOG("Saving palettized image...");

      int image_palette_format = image->getPaletteFormat(); // palette format
      int image_palette_size = image->getPaletteSize(); // palette size

      // allocate png palette and get pointer to image palette
      png_color* png_palette = (png_color*)png_malloc(
	png_ptr, sizeof(png_color) * image_palette_size);
      byte* image_palette = (byte*)image->getPalette();
      if (image_palette_format == PF_R8G8B8) {
	// 24 bit source palette
	for (int i = 0; i < image_palette_size; i++) {
	  // copy entry directly
	  png_palette[i].red   = *image_palette++;
	  png_palette[i].green = *image_palette++;
	  png_palette[i].blue  = *image_palette++;
	}
      } else if (image_palette_format == PF_R8G8B8A8) {
	// 32 bit source palette
	for (int i = 0; i < image_palette_size; i++) {
	  // copy entry, skip alpha
	  png_palette[i].red   = *image_palette++;
	  png_palette[i].green = *image_palette++;
	  png_palette[i].blue  = *image_palette++;
	  image_palette++;
	}
      }
      // write palette
      png_set_PLTE(png_ptr, info_ptr, png_palette, image_palette_size);
    }

    byte* pixels = (byte*)image->getPixels();

    // build rows
    void** rows = (void**)png_malloc(png_ptr, sizeof(void*) * height);
    for (int i = 0; i < height; ++i) {
      rows[i] = png_malloc(png_ptr, color_format_bpp * width);
      memcpy(rows[i], pixels, color_format_bpp * width);
      pixels += width * color_format_bpp;      
    }
    png_set_rows(png_ptr, info_ptr, (png_bytepp)rows);
    info_ptr->valid |= PNG_INFO_IDAT;

    // actually write the image
    png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);

    png_destroy_write_struct(&png_ptr, &info_ptr);
    return true;
  }