-
تبدیل به Jp2
سلام.
من خیلی دنبال این هستم که سورس 1 برنامه تبدیل BMP یا JPG رو به JPEG200 یا به قولی JP2 پیدا کنم.
کار عجیبی نیست.
الان سورس تبدیل BMP به PNG و JPG رو دارم.
اگر میشه، 1 نفر برام به یه زبون ساده، پیداش کنه.
می خوام آخرش تبدیلش کنم به زبون Flash (یا به قولی ActionScript).
اگر مستقیماً فلشش رو پیدا کنید که دیگه خیلی عالی میشه.
مرسی
خیلی منتظرم.
-
سلام
تبدیل تصاویر با فرمت های زیر به یکدیگر در دات نت با دو الی سه خط قابل انجام است.
(jpg-jpeg-jpe-bmp-dib-rle-emf-exif-gif-png-tiff-tif-wmf-(ico-cur
کد عمومی هم چنین خواهد بود:
کد:
Using img As System.Drawing.Image = System.Drawing.Image.FromFile("C:\file.extension")
img.Save("C:\newfile.extension", System.Drawing.Imaging.ImageFormat.FormatterName)
End Using
که مثلاً برای خروجی jpg چنین خواهد شد:
کد:
Using img As System.Drawing.Image = System.Drawing.Image.FromFile("C:\file.extension")
img.Save("C:\newfile.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
End Using
و برای خروجی png چنین خواهد شد:
کد:
Using img As System.Drawing.Image = System.Drawing.Image.FromFile("C:\file.extension")
img.Save("C:\newfile.png", System.Drawing.Imaging.ImageFormat.Png)
End Using
در مورد Flash کلاً هیچ اطلاعی ندارم و اصلاً در عمرم با Flash کار نکرده ام.
موفق باشید.
-
شرمنده فرمودید استاد.
ولی مشکل من هنوز هم پا برجاست.
من تبدیل به همه ی اونها رو می تونم داشته باشم، ولی jp2 رو...
من یه چیزی به اسم Jasper پیدا کردم ولی زیاد ازش سر در نمیارم!
(هنوز اونقدر ها تو ++C پیشرفت نکردم.)
اگر امکان داره، شما این رو برام به زبون ساده تر بنویسید:
کد:
http://www.ece.uvic.ca/~mdadams/jasper/software/jasper-1.900.1.zip
(می دونم که درخواست بیش از اندازه ای ه. ولی ببخشید!)
-
سلام
میبخشید اشتباه از من بود. یک سورس قدیمی ++vc داشتم که در نسخه 2005 به خوبی کامپایل و اجرا میشد، و این تبدیل را انجام میداد.
صبر کنید، پیدایش کنم.
-
قربان 2 دستت.
فقط لطفاً 1 جوری باشه که بشه ازش سر در آورد.
این Jasper انفدر سخت نوشته شده که اصلاً نمیشه فهمید چی به چیه!
مرسی
-
سلام
خبر خوب و کمی بد !
من کد نمونه را پیدا کنم و خوشبختانه به راحتی در VC++2008 موجود در VS2008 کامپایل و اجرا میشود (یعنی مشکل کدی و پروژه ای ندارد.)
یک exe و dll است، که در واقع به نظر میرسد کار اصلی توسط dll انجام میشود و exe فقط یک UI است.
1) اگر کدهای پروژه JpegLib را تغییر دهید، باید دستی کامپایلش کنید و lib خروجی را در پروژه J2kDemo کپی کنید
2) پروزه یک lib در حالت debug کم دارد، شما حتماً باید گزینه کامپایل را در VS روی Release تنظیم کنید.
3) نمونه کامپایل شده برنامه در پوشه Release-exe موجود است که میتوانید فایلهای jp2 را نمایش دهید و یا دیگر فایلها را به jp2 ذخیره کند.
البته راحت و سخت بودنش را دیگر باید خودتان ببینید.
cid-9b2bdd1b12ce8c7d.skydrive.live.com/self.aspx/H2FX.Net/VCpp-JP2.zip
-
واقعاً ممنون.
رفتم که بگیرمش و ببینم چجوریه.
مرسی
-
مخم پکید!!!!
استاد به دادم برس!
شما این رو نگاه کن:
کد:
package com.adobe.images
{
import flash.geom.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.utils.ByteArray;
/**
* Class that converts BitmapData into a valid PNG
*/
public class PNGEncoder
{
/**
* Created a PNG image from the specified BitmapData
*
* @param image The BitmapData that will be converted into the PNG format.
* @return a ByteArray representing the PNG encoded image data.
* @langversion ActionScript 3.0
* @playerversion Flash 9.0
* @tiptext
*/
public static function encode(img:BitmapData):ByteArray {
// Create output byte array
var png:ByteArray = new ByteArray();
// Write PNG signature
png.writeUnsignedInt(0x89504e47);
png.writeUnsignedInt(0x0D0A1A0A);
// Build IHDR chunk
var IHDR:ByteArray = new ByteArray();
IHDR.writeInt(img.width);
IHDR.writeInt(img.height);
IHDR.writeUnsignedInt(0x08060000); // 32bit RGBA
IHDR.writeByte(0);
writeChunk(png,0x49484452,IHDR);
// Build IDAT chunk
var IDAT:ByteArray= new ByteArray();
for(var i:int=0;i < img.height;i++) {
// no filter
IDAT.writeByte(0);
var p:uint;
var j:int;
if ( !img.transparent ) {
for(j=0;j < img.width;j++) {
p = img.getPixel(j,i);
IDAT.writeUnsignedInt(
uint(((p&0xFFFFFF) << 8)|0xFF));
}
} else {
for(j=0;j < img.width;j++) {
p = img.getPixel32(j,i);
IDAT.writeUnsignedInt(
uint(((p&0xFFFFFF) << 8)|
(p>>>24)));
}
}
}
IDAT.compress();
writeChunk(png,0x49444154,IDAT);
// Build IEND chunk
writeChunk(png,0x49454E44,null);
// return PNG
return png;
}
private static var crcTable:Array;
private static var crcTableComputed:Boolean = false;
private static function writeChunk(png:ByteArray,
type:uint, data:ByteArray):void {
if (!crcTableComputed) {
crcTableComputed = true;
crcTable = [];
var c:uint;
for (var n:uint = 0; n < 256; n++) {
c = n;
for (var k:uint = 0; k < 8; k++) {
if (c & 1) {
c = uint(uint(0xedb88320) ^
uint(c >>> 1));
} else {
c = uint(c >>> 1);
}
}
crcTable[n] = c;
}
}
var len:uint = 0;
if (data != null) {
len = data.length;
}
png.writeUnsignedInt(len);
var p:uint = png.position;
png.writeUnsignedInt(type);
if ( data != null ) {
png.writeBytes(data);
}
var e:uint = png.position;
png.position = p;
c = 0xffffffff;
for (var i:int = 0; i < (e-p); i++) {
c = uint(crcTable[
(c ^ png.readUnsignedByte()) &
uint(0xff)] ^ uint(c >>> 8));
}
c = uint(c^uint(0xffffffff));
png.position = e;
png.writeUnsignedInt(c);
}
}
}
شما به گفته ی خودت، هیچی از فلش نمی دونی. درسته؟
ببین چقدر راحت از رو این می تونی بفهمی که چجوری می تونی یه BMP رو به PNG تبدیل کنی.
اینی که شما دادی، 1 برنامه ی کامل (+ منو هاش) ه که توش انواع تبدیل رو داره (که باعث میشه مخ آدم بپکه!)
می دونم که تا اینجاش هم به اندازه ی کافی زحمت دادم.
ولی شما یکی از این 3 لطف رو بکن:
1- یه مبدل تو مایه های همین کدی که من گذاشتم، پیدا کنید (به همین سادگی)
2- اگر از اون کد سر در میارید (که حتماً در میارید) و حالش رو دارید (که قطعاً ندارید!) لطف کنید، اون قسمت مربوط به jp2 ی اون رو به سادگی کد من در بیارید.
3- هیچی دیگه. این رو یه جور هایی throw exception گذاشتم که اگر با اون 2 تای بالا مشکل داشتید، با سومی بتونید از زیرش فرار کنید :دی
خیلی خیلی مرسی
-
سلام
من هم خیلی وقت است ++VC کار نکرده ام و من هم کامل نمیتوانم کد را تحلیل کنم ولی به دستور شما نگاهی انداختم با یک نگاه مختصر مطلب مهم و مرکزی را متوجه شدم.
منابع مصرف هدر j2kdll.h را پیگیری کنید .... به متدهای LoadFrom و SaveAs میرسید ...
در واقع اصل کار توسط J2kDll.dll انجام میشود، طریقه استفاده اش هم در دو متد فوق مشخص و ساده است.
این dll جالب توجه میتواند bmp را به jp2 تبدیل کند و برعکس.
مثلاً با کپی کردن dll فوق در شاخه bin\Debug و یا bin\Release یک پروژه VB.Net (و یا C#.Net) و با کد ساده ای مثل این برنامه شما قادر خواهد بود تا با کمک این dll به هدف خود برسد. (تست کردم و جواب داد.)
کد:
Private Declare Ansi Function ImageTranscode Lib "J2kDll.dll" (ByVal source As String, ByVal target As String, ByVal ratio As Integer) As Integer
یعنی کد فوق را بعد از تعریف class بنویسید.
آنگاه با دستوری مثل این میتوانید فال ها را تبدیل کنید و کار هم خواهد کرد.
کد:
Dim ret As Integer = ImageTranscode("C:\file.bmp", "C:\file.jp2", 0)
If (ret <> 1) Then Error .... MessageBox ....
در واقع این برنامه هم همین کار را میکند،
برای نمایش jp2 آن را در یک فایل temp به bmp تبدیل میکند و bmp تازه ساخته شده را بارگذاری میکند و bmp را delete میکند.
برای ذخیره هم اول در یک فایل temp موقت bmp ذخیره میکند و سپس با dll تبدیل به jp2 میکند و نهایتاً bmp را حذف میکند.
فقط توجه داشته باشید که dll با مسیرهای یونیکدی (مثلاً پوشه ای با نام فارسی) مشکل دارد ولی شما میتوانید کارها را در سطح فایلهای موقت temp انجام دهید و نهایتاً خودتان عمل کپی را انجام دهید.
(شما میتوانید در هر زبان برنامه نویسی از این dll استفاده کنید)
-
خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی مرسی.
واقعاً شرمنده فرمودید.
بی خود که به شما نمی گن استاد.
واقعاً استادی رو به آخر رسوندید.
(دیگه نمی دونم چی بگم)
تازه داشتم مطلب راجع به Vector می خوندم که کم کم تحلیلش کنم.
باز هم ممنون.